2009-06-25 78 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)