Python - 子进程 - 如何在Windows中调用Piped命令?

Gre*_*reg 5 python subprocess pipe popen echo

如何使用子进程运行此命令?

我试过了:

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()
Run Code Online (Sandbox Code Playgroud)

但得到了:

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
Run Code Online (Sandbox Code Playgroud)

我注意到的事情:

  1. 在Windows控制台上运行该命令工作正常.
  2. 如果我删除ECHO bosco | 部分,它在上面的popen调用运行良好.所以我认为这个问题与echo或|有关.

phi*_*hag 11

首先,你实际上并不需要管道; 你只是发送输入.您可以使用subprocess.communicate.

其次,不要将命令指定为字符串; 一旦涉及带空格的文件名,那就太乱了.

第三,如果你真的想要执行一个管道命令,只需调用shell即可.在Windows上,我相信它cmd /c program name arguments | further stuff.

最后,单反斜杠可能是危险的:"\p"'\\p',但是'\n'是一个新线.使用os.path.join()os.sep,或者,如果在python外部指定,则只使用正斜杠.

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')
Run Code Online (Sandbox Code Playgroud)