Ich erhalte die folgende Fehlermeldung:
WindowsError: [Error 2] The system cannot find the file specified
Mein Code lautet:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64 Bit. Python 3.x aktuell, stabil.
Irgendwelche Ideen?
Vielen Dank,
python
path
python-3.x
Sri
quelle
quelle
Antworten:
Wenn der Befehl eine integrierte Shell ist, fügen Sie dem Aufruf eine 'shell = True' hinzu.
ZB für
dir
Sie würde schreiben:Um aus der Dokumentation zu zitieren:
quelle
dir.exe
während ein/bin/ls
in * nix vorhanden ist.dir
wird von CMD.EXE implementiert, ähnlich wiecd
es von bash implementiert wird .PATH
von der zu holenos.environ
und sie manuell zu durchsuchen.Unter Windows glaube ich, dass das
subprocess
Modul nur dann inPATH
shell=True
das Modul schaut, wenn Sie es bestehen, weil esCreateProcess()
hinter den Kulissen verwendet wird. Diesshell=True
kann jedoch ein Sicherheitsrisiko darstellen, wenn Sie Argumente übergeben, die möglicherweise von außerhalb Ihres Programms stammen. Umsubprocess
dennoch die richtige ausführbare Datei zu finden, können Sie verwendenshutil.which
. Angenommen, die ausführbare Datei in IhremPATH
heißtfrob
:(Dies funktioniert unter Python 3.3 und höher.)
quelle
Unter Windows müssen Sie über cmd.exe aufrufen. Wie von Apalala erwähnt, werden Windows-Befehle in cmd.exe nicht als separate ausführbare Dateien implementiert.
z.B
/ c weist cmd an, den Befehl follow auszuführen
Dies ist sicherer als die Verwendung von shell = True, wodurch Shell-Injektionen möglich sind.
quelle
/k
stattdessen/c
. Geben Siecmd /?
in der Befehlszeile Details ein.Wenn Sie Powershell verwenden, wird es darin sein
subprocess.call(['powershell','-command','dir'])
. Powershell unterstützt einen großen Teil der POSIX-Befehlequelle
Nach langem Kopfkratzen stellte ich fest, dass das Ausführen einer Datei in C: \ Windows \ System32 \ beim Ausführen einer 32-Bit-Version von Python auf einem 64-Bit-Computer ein potenzielles Problem darstellt, da Windows versucht, den Prozess zu übertreffen Leiten Sie Aufrufe an C: \ Windows \ System32 nach C: \ Windows \ SysWOW64 um.
Ich habe hier ein Beispiel gefunden, wie dies behoben werden kann: http://code.activestate.com/recipes/578035-disable-file-system-redirector/
quelle
Um aus der Dokumentation zu zitieren:
"Vor Python 3.5 umfassten diese drei Funktionen die API für die Unterverarbeitung auf hoher Ebene. In vielen Fällen können Sie jetzt run () verwenden, aber viele vorhandene Codes rufen diese Funktionen auf."
SO: Verwenden Sie anstelle von subprocess.call subprocess.run für Python 3.5 und höher
quelle
Ich habe das gleiche Problem beim Aufrufen eines PHP festgestellt. Der Grund dafür ist, dass PHP nicht in PATH enthalten ist und der Befehl PHP nicht gefunden wurde. PowerShell hat jedoch festgestellt, dass es am aktuellen Speicherort vorhanden ist, und schlägt vor, das 'PHP' durch das '. \ PHP' zu ersetzen, wenn ich diesem Befehl vertraue. Dann läuft es gut.
quelle