Domanda

Come posso eseguire questo comando con sottoprocesso?

Ho provato:

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()

ma ottenuto:

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

Cose che ho notato:

  1. Esecuzione del comando su Windows la console funziona bene.
  2. Se rimuovo il ECHO bosco | parte, funziona benissimo il la chiamata popen sopra. Quindi penso questo problema è legato all'eco o |.
È stato utile?

Soluzione

Innanzitutto, in realtà non hai bisogno di una pipe; stai solo inviando input. Puoi usare subprocess.communicate per questo.

In secondo luogo, non specificare il comando come stringa; è disordinato non appena vengono coinvolti i nomi di file con spazi.

In terzo luogo, se si voleva davvero eseguire un comando in pipe, basta chiamare la shell. Su Windows, credo che sia cmd /c program name arguments | further stuff.

Infine, le singole barre rovesciate possono essere pericolose: "\p" è '\\p', ma '\n' è una nuova riga. Usa os.path.join () o os.sep o, se specificato all'esterno di Python, solo una barra. < p>

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')

Altri suggerimenti

Avevi ragione, ECHO è il problema. Senza l'opzione shell = True non è possibile trovare il comando ECHO.

Questo non riesce con l'errore che hai visto:

subprocess.call(["ECHO", "Ni"])

Questo passa: stampa Ni e uno 0

subprocess.call(["ECHO", "Ni"], shell=True)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top