2

杀死在 Linux 下使用shell=True传递给subprocess.Popen的构造函数创建的子进程只会杀死 shell 而不会杀死由 shell 创建的进程(请参阅如何终止使用 shell=True 启动的 python 子进程)。但是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() 调用 TerminateProcess. 但是此功能的文档说明

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

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

4

1 回答 1

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()"
于 2012-10-22T10:18:42.280 回答