Python - Subprocess - Wie ein Piped Befehl in Windows nennen?
-
20-08-2019 - |
Frage
Wie führe ich diesen Befehl mit subprocess?
Ich habe versucht:
proc = subprocess.Popen(
'''ECHO bosco|"C:\Program Files\GNU\GnuPG\gpg.exe" --batch --passphrase-fd 0 --output "c:\docume~1\usi\locals~1\temp\tmptlbxka.txt" --decrypt "test.txt.gpg"''',
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
stdout_value, stderr_value = proc.communicate()
bekam aber:
Traceback (most recent call last):
...
File "C:\Python24\lib\subprocess.py", line 542, in __init__
errread, errwrite)
File "C:\Python24\lib\subprocess.py", line 706, in _execute_child
startupinfo)
WindowsError: [Errno 2] The system cannot find the file specified
Dinge, die ich habe bemerkt:
- Ausführen des Befehls an den Fenstern Konsole funktioniert gut.
- Wenn ich das entfernen ECHO bosco | Teil, läuft es fein die der popen Anruf oben. Deshalb denke ich, wird dieses Problem im Zusammenhang mit echo oder |.
Lösung
In erster Linie müssen Sie nicht tatsächlich ein Rohr; Sie senden nur Eingang. Sie können verwenden subprocess.communicate dafür.
Zweitens geben Sie nicht den Befehl als Zeichenfolge; das ist chaotisch, sobald die Dateinamen mit Leerzeichen beteiligt sind.
Drittens, wenn Sie wirklich einen verrohrt Befehl auszuführen wollte, rufen Sie einfach die Schale. Unter Windows Ich glaube, es cmd /c program name arguments | further stuff
ist.
Schließlich Single zurück Schrägstriche können gefährlich sein: "\p"
ist '\\p'
, aber '\n'
ist eine neue Linie. Verwenden Sie os.path.join () oder os.sep oder, wenn außerhalb python angegeben, nur einen Schrägstrich.
proc = subprocess.Popen(
['C:/Program Files/GNU/GnuPG/gpg.exe',
'--batch', '--passphrase-fd', '0',
'--output ', 'c:/docume~1/usi/locals~1/temp/tmptlbxka.txt',
'--decrypt', 'test.txt.gpg',],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
stdout_value, stderr_value = proc.communicate('bosco')
Andere Tipps
Sie haben Recht, ist das ECHO das Problem. Ohne den shell = der Befehl ECHO Wahr Option kann nicht gefunden werden.
Dies schlägt mit dem Fehler, den Sie gesehen:
subprocess.call(["ECHO", "Ni"])
Dies passiert: prints Ni und 0
subprocess.call(["ECHO", "Ni"], shell=True)