2013-12-11 58 views
1

我使用subprocess.Popen來調用控制檯應用程序。控制檯應用程序本身調用另一個子進程來執行下載操作。父進程一旦調用子進程就退出。Python Subprocess.Popen不能退出,它會被吊死

我能夠在命令提示符下手動運行腳本時獲取子進程的輸出。

但是在系統環境(post commit hook)中運行腳本時subprocess.Popen被掛起。子進程沒有退出。

p1 = subprocess.Popen([Application,arg1, arg2, arg3], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 
Down_out = p1[0] 
Down_Err = p1[1] 

在此先感謝

+0

這與'svn'有什麼關係? –

+0

在提交發生在我的svn版本庫中時,從post commit hook調用的python腳本 – user1553605

+0

'shell = True'和列表參數幾乎總是一個錯誤。或者刪除'shell = True'(並保留list參數)或將列表參數轉換爲字符串(shell命令,因爲它將出現在控制檯中)。 – jfs

回答

0

很難從你給的信息說,但它可能是arguments是與多個參數的字符串時,他們應分成列表中的多個元素。如果將所有參數組合到一個字符串中,則正在執行的程序的行爲不會成爲您所期望的。

例如:

>>> from subprocess import Popen 
>>> Popen(['touch', '/tmp/testing /tmp/foo']).communicate() 
touch: cannot touch ‘/tmp/testing /tmp/foo’: No such file or directory 
(None, None) 
>>> Popen(['touch', '/tmp/testing', '/tmp/foo']).communicate() 
(None, None) 

在第一個,'/tmp/testing /tmp/foo'是一個字符串。

第二,它是列表中的兩個單獨的元素。這按預期運行。

我猜你的吊because是因爲無效論點。

+0

我已經提供了參數arg1,arg2,....仍然面臨同樣的錯誤 – user1553605

+0

你能提供你傳遞的確切參數,而不是應用程序,arg1,arg2等嗎?另外,當你手動運行時你看到了什麼? – johannestaas