2016-07-25 8 views
0

Ich habe ein bisschen ein Rätsel bei der Arbeit an einem Automatisierungsprojekt angetroffen."Modus" läuft nicht in Python 3.5 Subprozess

Wenn ich versuche zu laufen:

program = subprocess.run("mode") 

ich:

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

Allerdings, wenn ich ersetzen Modus mit ipconfig:

program = subprocess.run("ipconfig") 

es völlig in Ordnung läuft.

Wer hat eine Erklärung? Ich verwende derzeit eine Batch-Datei, um den Modus-Befehl auszuführen, aber ich möchte die Argumente ändern, ohne eine Batch-Datei zu bearbeiten.

Edit 1:

ich auch gerade versucht os.system mit:

os.system("mode") 

und das funktionierte auch.

Edit 2:

nun wie Antwort auf das ursprüngliche Problem nur zu verstehen, was ich würde würde.

+0

Sie könnten 'shell = True' benötigen? –

+0

@Wayne Werner Also ich habe es mit Popen probiert und die Hülle auf True gestellt und es hat auch geklappt. Hast du eine Ahnung, warum es so funktioniert? Vielen Dank! – FlyingLightning

Antwort

1

In Actual meaning of 'shell=True' in subprocess sagt es ziemlich viel, dass shell=True etwas ist, vor dem Sie zurückschrecken sollten.

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

Ist das, was mich kippte weg, dass Sie shell=True in Ihrem subprocess Aufruf wollen könnte. Wenn die Datei nicht gefunden werden kann, bedeutet dies eines von zwei Dingen:

  1. Es ist nicht auf Ihrem Weg.
  2. Es ist nicht eigentlich eine Datei.

Zum Beispiel in Linux:

$ which echo 
echo: shell built-in command 

, dass es ziemlich offensichtlich macht, dass es ist keine echo Datei. Es ist nur ein Befehl, der in die Shell eingebaut ist. Diese kann die gleiche Sache sein, wenn es um mode unter Windows geht. Obwohl this site scheint darauf hinzuweisen, dass es sich um eine MODE.COM Datei handelt. Sie können versuchen, dass, wie in

subprocess.run('MODE.COM') 

Aufruf, die funktionieren kann - zumindest nach einem der the answers, die ich

verknüpft

über die Shell aufrufen Sie erlaubt Umgebungsvariablen zu erweitern und Dateikügelchen nach dem üblichen Mechanismus der Shell. Auf POSIX-Systemen erweitert die Shell Datei-Globs zu einer Liste von Dateien. Unter Windows wird ein Datei-Glob (z. B. ". „) wird von der Shell nicht erweitert, ohnehin (aber Umgebungsvariablen in einer Befehlszeile werden von cmd.exe erweitert).

Also in Ihrem Fall ist vielleicht mode keine Datei, sondern MODE.COMist, und da Windows eine fleckige Beziehung mit Gehäuse hat, scheint es möglich, dass durch die Übergabe shell=True, nimmt die Windows-Shell gerne mode und konvertiert es für Sie MODE.COM, aber ohne es versucht, die Datei mit dem wörtlichen Namen mode, die doesn ausgeführt wird 't exist.