2012-10-22 177 views
2

使用shell=True傳遞給subprocess.Popen的構造函數創建的kill子進程僅殺死shell而不是shell創建的進程(請參閱How to terminate a python subprocess launched with shell=True)。但是,在Windows Vista x64 SP3下運行python -c "import subprocess; subprocess.Popen(['ping', '-t', 'google.com'], shell=True).terminate()",並且Python 2.7.3 64位殺死了ping進程。在Windows下subprocess.Popen.terminate()callsTerminateProcess。但documentation的這個功能狀態爲什麼Popen.terminate()在Windows上終止使用命令解釋程序(cmd.exe)運行子進程?

終止指定進程及其所有線程。

沒有提到關於終止整個進程樹。我錯過了什麼?

+0

有趣的是,這種矛盾 cdarke

+0

@cdarke有趣,確實。感謝您鏈接到該問題。在這個問題中,我詢問了有關版本或Python和Windows的問題。 –

回答

2

我認爲這只是與你給予的一行,而我的觀察表明ping甚至沒有開始。如果你作爲一個腳本(Windows 7)中運行:

import subprocess 

proc = subprocess.Popen(['ping', '-t', 'google.com'], shell=True) 

raw_input("<RETURN> to terminate") 
proc.terminate() 

raw_input("<RETURN> to end") 

然後proc.terminate()只有終止外殼,它終止ping

但是,如果您設置了shell=False,那麼它的行爲與預期相同 - 它會終止ping。 Python 2.7和3.2中的相同行爲。

編輯:我也試過這個代碼作爲一個單線,並得到了與提問者相同的結果。我恨sleep黑客,但這個工程:

python -c "import subprocess,time;proc = subprocess.Popen(['ping','-t', 'google.com'], shell=True);time.sleep(1);proc.terminate()" 
+0

不錯的工作。我在Windows XP SP3上得到了相同的結果。任何想法爲什麼'sleep()'改變行爲? –

+0

我只能猜測。我懷疑終止程序會在shell啓動'ping'之前殺死shell。正如文檔所述,我查看了2.7源代碼(Python-2.7.2/PC/_subprocess.c,函數sp_TerminateProcess),它沒有任何異常,它只是調用TerminateProcess。 – cdarke

相關問題