2009-06-25 42 views
5

如何使用子进程运行此命令?Python - 子进程 - 如何在Windows中调用管道命令?

我想:

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() 

,但得到:

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 

事情我已经注意到:

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

请问,当你在Windows控制台运行全线实际工作? WindowsError表明这个问题不是你的Python代码,而是要执行的实际命令。 – 2009-06-25 22:10:14

+0

是的,它从Windows dos控制台运行。 – Greg 2009-06-25 22:15:13

回答

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') 
+0

谢谢,这工作! – Greg 2009-06-25 22:43:37

4

你说得对,ECHO是问题所在。如果没有shell = True选项,则无法找到ECHO命令。

这种失败与你看到的错误:

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

这传递:打印镍和0

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