Aufrufende app von Teilprozess.Aufruf mit Argumenten
Ich bin ein Anfänger in Python und ich habe versucht, rufen Sie ein Kommandozeilen-app, aber es scheitert:
>>> 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
Aber dann wenn ich auf add shell=True
es beginnt zu arbeiten. Kann mir jemand erklären, warum?
>>> import subprocess as s
>>> s.call("gpio -g read 17", shell=True)
>>> 0
InformationsquelleAutor der Frage Mark Ingram | 2012-08-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie nicht mit anrufen. Blick auf die Einführung oder die Beispiele in den docs. Das erste argument von call ist, "args", eine Folge von Argumenten, wobei arg[0] ist das Programm laufen zu lassen.
So, wenn Sie dies tun:
Gibt es zwei Möglichkeiten Teilprozess interpretieren könnte. Es sollte ein Programm namens "g" mit den Argumenten "p", "i", "o", " ", usw. (Denken Sie daran, strings sind Sequenzen von Zeichen.) Es könnte stattdessen ein Programm namens "gpio -g read 17" ohne weitere Argumente. So oder so, es ist nicht zu finden, so ein Programm. (Es sei denn, Sie geschehen, haben ein Programm namens "g" oder "gpio -g read 17" auf deinem WEG, in dem Fall werde es das falsche tun, anstatt Ihnen ein Fehler...)
Was Sie wollen, ist:
So, warum funktioniert das, wenn Sie pass
shell=True
? Weil diese ganze string übergeben bekommt, um die shell, die dann Ihren eigenen Parsen der Kommandozeile und trennt Dinge durch die Räume. Es ist wie das aufrufenos.system("gpio -g read 17")
.Bitte beachten Sie, dass alle der oben genannten ist etwas zu stark vereinfacht (es ignoriert die Windows-und shell-parsing ist nicht wirklich einfach nur "durch Leerzeichen getrennt", und so weiter), so sollten Sie tatsächlich die Dokumentation Lesen. (Auch, wer schrieb die
subprocess
docs ist eine bessere Schreiber als mich.)InformationsquelleAutor der Antwort abarnert