在Linux下传递给shell=True
构造函数的subprocess.Popen
创建的杀死子进程只会杀死shell而不是shell创建的进程(参见How to terminate a python subprocess launched with shell=True)。但是python -c "import subprocess; subprocess.Popen(['ping', '-t', 'google.com'], shell=True).terminate()"
在Windows Vista x64 SP3和Python 2.7.3 64bit下运行会导致ping
进程失效。在Windows subprocess.Popen.terminate()
calls TerminateProcess
下。但是此函数的documentation表示
终止指定的进程及其所有线程。
没有提到终止整个进程树。我错过了什么?
答案 0 :(得分: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()
只终止shell,它不终止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()"