2016-04-21 4 views
0

ausführen Ich brauche ein Python-Skript, das eine externe Anwendung auf cmd ausführen und die Ausgabe in einer Textdatei bereitstellen wird.Um externe App von cmd mit Python

Manuell funktioniert es gut für mich, wenn ich cmd als Administrator ausführen und den folgenden Befehl ausführen.

'C:\Program Files\Decoder>decoder -o hex.txt L3 0803'. 

Ich bekomme richtige Ausgabe in hex.txt-Datei wie erforderlich. Ich versuche, mit Hilfe eines Python-Skript, dies zu tun, wie folgt:

import subprocess 

cmd = "C:\Program Files\Decoder>decoder -o hex.txt L3 0803" 
subprocess.Popen(cmd) 

Ich bin nicht die erforderliche Leistung zu bekommen.

+0

Welche Ausgabe bekommen Sie, und wie unterscheidet es sich von dem, was Sie wollen? Es ist schwer zu sehen, was deine Frage ist. Übrigens sollte Ihr \ entweder maskiert sein oder eine rohe Zeichenkette verwenden: 'cmd = r" C: \ Programme \ Decoder \ Decoder -o hex.txt L3 0803 "'. Lesen Sie auch die Dokumentation zum Bereitstellen von Argumenten in einer Liste unter Windows. – cdarke

+0

Gibt es einen Fehler, oder unterdrücken Sie einen OSError? Probieren Sie es mit dem Befehl als Liste aus: '' subprocess.Popen (['C: \ Programme \ Decoder> Decoder', '-o', 'hex.txt', 'L3', '0803']).) '' – nephlm

+0

@cdarke Anwendungspfad ist nur "C: \ Programme \ Decoder". Danach ist es die Kommandozeilensyntax, um den 0803-Hex-Dump mit dem Decoder zu dekodieren und diese dekodierte Ausgabe in die hex.txt-Datei zu kopieren. – Shaun

Antwort

0

Wie Sie in der Dokumentation sehen können, erwartet Popen eine Liste und keine Zeichenfolge.

Außerdem haben Sie einen Pfadfehler in Ihrem Befehl (> sollte \ sein) und Sie müssen Backslashes entkommen.

versuchen mit

import subprocess 

cmd = ["C:\\Program Files\\Decoder\\decoder", "-o", "hex.txt", "L3", "0803"] 
subprocess.Popen(cmd) 
+0

'Popen' erwartet nicht nur eine Liste auf Windows oder POSIX. Windows 'CreateProcess' benötigt eine Befehlszeile, weil jedes Programm die Befehlszeile beliebig analysieren kann. Wenn Sie eine Liste übergeben, wird sie durch 'subprocess.list2cmdline' in eine Zeichenfolge umgewandelt, die den MSVC-Regeln folgt. Dies funktioniert jedoch nicht immer. Daher ist es manchmal notwendig, eine Zeichenfolge anstelle einer Liste zu verwenden. Auf POSIX-Systemen benötigen Sie eine Zeichenfolge, wenn Sie 'shell = True' verwenden, wodurch die Shell die Befehlszeile analysiert. Andernfalls werden die Parameter als Argumente für die Shell selbst übergeben. – eryksun

+1

Dies sollte funktionieren: 'cmd = r" C: \ Programme \ Decoder \ decoder -o hex.txt L3 0803 ";' 'p = subprocess.Popen (cmd);' 'p.wait()'. – eryksun

+0

@eryksun nach dem Ausführen dieser bekomme ich Fehler "Windows-Fehler: keine gültige Win32-Anwendung" – Shaun