Ich habe einige benutzerdefinierte Befehle.
# works
subprocess.Popen(['python'], stdout=subprocess.PIPE)
Wenn ich jedoch eigene Systembefehle wie deactivate
habe, erhalte ich diesen Fehler
Traceback (most recent call last):
File "runner2.py", line 21, in <module>
main()
File "runner2.py", line 18, in main
subprocess.Popen(['deactivate',], stdout=subprocess.PIPE)
File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Ganz zu schweigen davon, dass ich dies unter meiner Sandbox virtualenv ausführen muss.
Fügen Sie dem Aufruf Popen
einen zusätzlichen Parameter 'Shell = True' hinzu.
Nur eine Notiz. Shell=True
war wahrscheinlich die richtige Lösung für den o.p., da der folgende Fehler nicht gemacht wurde. Sie können jedoch auch die Fehlermeldung "Keine solche Datei oder Verzeichnis" erhalten, wenn Sie Ihre ausführbare Datei nicht von ihren Argumenten trennen.
import subprocess as sp, shlex
sp.Popen(['echo 1']) # FAILS with "No such file or directory"
sp.Popen(['echo', '1']) # SUCCEEDS
sp.Popen(['echo 1'], Shell=True) # SUCCEEDS, but extra overhead
sp.Popen(shlex.split('echo 1')) # SUCCEEDS, equivalent to #2
Ohne Shell=True
erwartet Popen, dass die ausführbare Datei das erste Element von args ist. Aus diesem Grund schlägt die Ausführung fehl. Es gibt keine ausführbare Datei "echo 1". Durch Hinzufügen von Shell=True
wird die System-Shell aufgerufen und das erste Element von args
an die Shell übergeben. für Linux ist Popen(['echo 1'], Shell=True)
äquivalent zu Popen('/bin/sh', '-c', 'echo 1')
, was mehr Aufwand bedeutet, als Sie benötigen. Siehe Popen () - Dokumentation für Fälle, in denen Shell=True
tatsächlich nützlich ist.
Sie müssen den vollständigen Pfad zu Ihrem Programm deactivate
angeben und dann sollte es das Unterprozess-Modul finden können.
Ich lebe so Unterprozesse:
SHUTDOWN_CMD = os.path.sep.join(["c:", "windows", "system32", "shutdown.exe"])
def abortShutdown():
os.spawnv(os.P_NOWAIT, SHUTDOWN_CMD,
[SHUTDOWN_CMD, '/A'])
time.sleep(3)
Ich verwende keinen Unterprozess, da Python 2.5 ihn nicht unterstützt. Ich musste den VOLLSTÄNDIGEN Pfad verwenden, damit es funktioniert. Ich denke, Sie müssen auch den vollständigen Pfad zu Ihren benutzerdefinierten Befehlen verwenden.