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:

  1. A execução do comando nas janelas consola funciona bem.
  2. 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 |.
Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top