Appel de l'application à partir de subprocess.call avec des arguments
Je suis débutant en Python, et j'ai essayé d'appeler une application en ligne de commande, mais il échoue:
>>> import subprocess as s
>>> s.call("gpio -g read 17")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/subprocess.py", line 470, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.6/subprocess.py", line 623, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1141, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Mais alors si j'ajoute shell=True
tout commence à travailler. Quelqu'un peut m'expliquer pourquoi?
>>> import subprocess as s
>>> s.call("gpio -g read 17", shell=True)
>>> 0
source d'informationauteur Mark Ingram
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas en utilisant l'appel de droite. Regardez l'introduction ou l'autre des exemples dans les docs. Le premier argument de l'appel est "args", une séquence d'arguments, où arg[0] est le programme à exécuter.
Donc, quand vous faites cela:
Il y a deux façons sous-processus pourrait l'interpréter. Il doit exécuter un programme appelé "g" avec les arguments "p", "i", "o", " ", etc. (Rappelez-vous, les chaînes sont des séquences de caractères.) Au contraire, il pourrait exécuter un programme appelé "gpio -g lu 17" avec aucun des arguments supplémentaires. De toute façon, il ne va pas trouver un tel programme. (Sauf si vous arrive d'avoir un programme appelé "g" ou "gpio -g lu 17" sur votre CHEMIN, auquel cas, il va faire la mauvaise chose au lieu de vous donner une erreur...)
Ce que vous voulez, c'est:
Alors, pourquoi cela fonctionne si vous passez
shell=True
? Parce que toute cette chaîne est passée à la coquille, qui effectue ensuite sa propre analyse de la ligne de commande et sépare les choses par des espaces. C'est comme appeleros.system("gpio -g read 17")
.Veuillez noter que tous les ci-dessus est un peu trop simpliste (il ignore Windows, shell et l'analyse n'est pas vraiment le "séparés par des espaces", et ainsi de suite), de sorte que vous devriez lire la documentation. (D'ailleurs, celui qui a écrit l'
subprocess
docs est un meilleur écrivain que moi.)