为什么Popen.terminate()在Windows上使用命令解释器(cmd.exe)终止子进程运行?

时间:2012-10-22 09:33:32

标签: python windows shell subprocess kill-process

在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表示

  

终止指定的进程及其所有线程。

没有提到终止整个进程树。我错过了什么?

1 个答案:

答案 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()"