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

标签 python windows shell subprocess kill-process

终止使用 shell=True 创建的子进程传递至subprocess.Popen Linux 下的构造函数仅杀死 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 64 位下运行会杀死 ping过程。在 Windows 下 subprocess.Popen.terminate() calls TerminateProcess 。然而documentation该函数指出

Terminates the specified process and all of its threads.

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

最佳答案

我认为这只是您给出的一句话,而且我的观察表明 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()"

关于python - 为什么 Popen.terminate() 在 Windows 上终止使用命令解释器 (cmd.exe) 运行的子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13008513/

相关文章:

c++ - OpenGL 上下文创建期间未记录的错误

linux - 使用 find 命令 rsync 备份文件到远程服务器

php - 确保系统调用在所有先前的系统调用之后运行

python - 如何使用 Boto3 (Python) 列出可用区域

python - 如何在 PyQt 中创建可折叠框

c# - 确定网络驱动器的协议(protocol)

ruby-on-rails - $rake db :migrate An error has occurred, 这个和所有后来的迁移都被取消了

linux - 与 cat 相比,Bash while read 循环非常慢,为什么?

python - 使用 Beautiful Soup 和 Python 抓取 Asp.NET 网站

Python-将带有大写和小写字符串元素的遗传数据(不带空格)拆分为列表