2016-10-29 4 views
0

Ich mache eine GUI, die an der Eingabeaufforderung mit Subprozess und Tkinter ausführen kann.Subprozess - FileNotFoundError wenn Shell = False

def test_subprocess(self): 
     proc = subprocess.Popen(["echo", "Hello"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, shell=False) 
     response = proc.communicate()[0] 
     self.log.insert("end", response) 

Wenn ich gesetzt shell=False, bekomme ich diesen Fehler:

FileNotFoundError: [WinError 2] The system cannot find the file specified 

Ich habe bereits die Argumente in eine Sequenz getrennt.

Antwort

3

Das liegt daran, echo ist ein integrierter Befehl in Windows, keine ausführbare Datei. Sie haben zu aktivieren shell=True, damit es funktioniert.

(oder den Shell-Präfix hinzufügen, wie bash -c oder cmd /c auf Ihrem O abhängig)

ex für Sie Fenster: das funktioniert:

proc = subprocess.Popen(["cmd", "/c", "echo", "Hello"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, shell=False) 

Aber ich nehme an, dies nur eine Übung ist, da läuft echo von Popen Overkill für print ist :)

Hinweis: in Linux/UNIX ist es auch in gebaut, aber als cdarke erwähnt, gibt es einen Rückfall ausführbare Datei in /bin auf einigen Versionen, so würde das funktionieren.

+1

Nur hinzufügen, viele UNIX-Systeme haben '/ bin/echo' sowie die eingebaute Shell, so dass Sie wahrscheinlich nur dieses spezielle Problem unter Windows bekommen würden. – cdarke

+1

@cdarke: nett. Der Benutzer verwendet eindeutig Windows, die Fehlermeldung ist als die schlechteste überhaupt erkennbar, nicht einmal sagen, welche Datei es nicht finden kann :) –

+0

Hassen Sie es nicht, wenn der Dateiname nicht gemeldet wird? Es weiß verdammt gut, * welche Datei es nicht finden kann, aber es ist uns nicht lästig, es uns zu sagen. Sie können nicht einmal "strace" ausführen, um es herauszufinden. – cdarke