2009-06-25 16 views
5

¿Cómo ejecuto este comando con subproceso?Python - Subproceso - ¿Cómo llamar un comando Piped en Windows?

me trataron:

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 tiene:

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. La ejecución del comando en las ventanas consola funciona bien.
  2. Si quito el ECHO Bosco | parte, funciona bien el la llamada popen arriba. Así que creo que este problema está relacionado con eco o |.
+0

¿Eso línea completa funcionan realmente cuando se ejecuta en la consola de Windows? WindowsError sugiere que el problema no es su código de Python, sino el comando real que se ejecutará. –

+0

Sí, se ejecuta desde la consola windows dos. – Greg

Respuesta

11

Primero y ante todo, que en realidad no necesitan una tubería; solo estás enviando entrada. Puedes 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 quería para ejecutar un comando canalizado, simplemente llame a la cáscara. En Windows, creo que es cmd /c program name arguments | further stuff.

Por último, las barras oblicuas traseras pueden ser peligrosas: "\p" es '\\p', pero '\n' es una nueva línea. Use 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') 
+0

¡Gracias, eso funcionó! – Greg

4

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

Esta falla con el error que viste:

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

Esto pasa: impresiones de Ni y un 0

subprocess.call(["ECHO", "Ni"], shell=True) 
+0

en realidad, ¿no debería ser 'subprocess.call (" ECHO Ni ", shell = True)'? y 'subprocess.call ([" ECHO "," Ni "])' funciona bien para mí. – Chris

+0

Puede utilizar cualquiera pero de acuerdo con el [Popen Constructor] (https://docs.python.org/3/library/subprocess.html#popen-constructor) documentos: “A menos que se indique lo contrario, se recomienda pasar args como una secuencia ". –

Cuestiones relacionadas