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:

  1. Ausführen des Befehls an den Fenstern Konsole funktioniert gut.
  2. 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 |.
War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top