终止使用 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/