Python - subprocesso - como chamar um comando canalizado no Windows?
-
20-08-2019 - |
Pergunta
Como faço para executar este comando com subprocesso?
Eu tentei:
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()
mas tenho:
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
As coisas que eu notei:
- A execução do comando nas janelas consola funciona bem.
- Se eu remover o ECHO bosco | parte, ele funciona muito bem o a chamada popen acima. Então eu acho Este problema está relacionado para ecoar ou |.
Solução
Em primeiro lugar, você não realmente precisa de um tubo; você está apenas enviando entrada. Você pode usar subprocess.communicate para isso.
Em segundo lugar, não especifique o comando como uma string; que é confuso, logo que nomes de arquivos com espaços estão envolvidos.
Em terceiro lugar, se você realmente queria para executar um comando canalizado, basta ligar para o shell. No Windows, eu acredito que é cmd /c program name arguments | further stuff
.
Finalmente, barras invertidas únicas pode ser perigoso: "\p"
é '\\p'
, mas '\n'
é uma nova linha. Use os.path.join () ou os.sep ou, se especificado python fora, apenas uma barra.
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')
Outras dicas
Você estava certo, o ECHO é o problema. Sem o shell = True opção o comando ECHO não pode ser encontrada.
Esta falha com o erro que você viu:
subprocess.call(["ECHO", "Ni"])
Esta passes: impressões Ni e um 0
subprocess.call(["ECHO", "Ni"], shell=True)