Pregunta

¿Cómo ejecuto este comando con subproceso?

Intenté:

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

pero obtuve:

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

Cosas que he notado:

  1. Ejecutando el comando en las ventanas La consola funciona bien.
  2. Si elimino el ECHO bosco | parte, funciona bien el la llamada de popen arriba. Por eso pienso este problema está relacionado con echo o |.
¿Fue útil?

Solución

En primer lugar, en realidad no necesitas una tubería; solo estás enviando información. Puede usar subprocess.communicate para eso.

En segundo lugar, no especifique el comando como una cadena; eso es complicado tan pronto como los nombres de archivo con espacios están involucrados.

En tercer lugar, si realmente desea ejecutar un comando canalizado, simplemente llame al shell. En Windows, creo que es cmd /c program name arguments | further stuff.

Finalmente, las barras diagonales simples pueden ser peligrosas: "\p" es '\\p', pero '\n' es una nueva línea. Utilice os.path.join () o os.sep o, si se especifica fuera de Python, solo una barra diagonal.

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

Otros consejos

Tenías razón, el problema es ECHO. Sin la opción shell = True, no se puede encontrar el comando ECHO.

Esto falla con el error que viste:

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

Esto pasa: imprime Ni y un 0

subprocess.call(["ECHO", "Ni"], shell=True)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top