web-dev-qa-db-de.com

Popen-Fehler: [Errno 2] Keine solche Datei oder Verzeichnis

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. 

39
user1012451

Fügen Sie dem Aufruf Popen einen zusätzlichen Parameter 'Shell = True' hinzu. 

93
Anthony Kong

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.

29
Mark Woodward

Sie müssen den vollständigen Pfad zu Ihrem Programm deactivate angeben und dann sollte es das Unterprozess-Modul finden können.

3
Senthil Kumaran

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.

0
katzenversteher