Python - Subproceso - ¿Cómo llamar a un comando canalizado en Windows?
-
20-08-2019 - |
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:
- Ejecutando el comando en las ventanas La consola funciona bien.
- Si elimino el ECHO bosco | parte, funciona bien el la llamada de popen arriba. Por eso pienso este problema está relacionado con echo o |.
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)