使用Python的subprocess.Popen()创建的进程如何终止?

84

我的想法如下:

首先,我使用subprocess.Popen创建了一个进程。

其次,在一定时间后,我尝试使用Popen.kill() 来终止它。

import subprocess
import os, signal
import time

proc1 = subprocess.Popen("kvm -hda /path/xp.img", shell = True)
time.sleep(2.0)
print 'proc1 = ', proc1.pid
subprocess.Popen.kill(proc1)

然而,在调用Popen.kill()之后,"proc1"仍然存在。请问有哪位专家能告诉我如何解决这个问题?感谢您的考虑。

感谢所有专家的评论,我已经按照大家推荐的做了,但结果仍然没有改变。

proc1.kill() #它依然无法杀死proc1

os.kill(proc1.pid, signal.SIGKILL) # either cannot kill the proc1

谢谢大家的支持。

我仍在等待您宝贵的经验,帮助解决这个微妙的问题。


为什么需要“shell = True”?没有它,它似乎正好按照您的预期工作。 - Michael Patterson
4
请不要在标题中写上 [已解决],而是选择正确的答案并点击勾选符号。 - bluish
2
请参考以下链接,了解如何终止使用shell=True启动的Python子进程:https://dev59.com/pW445IYBdhLWcg3wl7TW - Sam Watkins
subprocess.Popen.kill(proc)proc.kill() 是完全相同的,供您参考。 - Erik Kaplun
1
很少有情况kill -9不起作用。你的问题可能是需要杀死整个进程树 - jfs
4个回答

54

26
首先感谢您。然而,我尝试了这个方法,它仍然不起作用... - user495511
5
kill()terminate()是不同的。 kill()方法发送SIGKILL信号,而terminate()方法发送SEGTERM信号。区别在于前者会立即终止进程,而后者只停止进程。 - Mohamed Horani

41

process.terminate()在使用shell=True时无法工作。这个答案会对你有所帮助。


5
非常感谢,你的回答解决了我3个小时的调试问题。 - tahayk
1
适用于Windows二进制文件... - 3kstc

13

只使用Popen的kill方法

process = subprocess.Popen(
    task.getExecutable(), 
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE, 
    shell=True
)
process.kill()

5
在“process.kill()”前加上“time.sleep(x)”之前,这是有效的。 - user495511

0

6
谢谢,但是 "os.kill(proc1.pid, signal.SIGTERM)" 或者 "os.kill(proc1.pid, signal.SIGKILL)" 不起作用。 - user495511

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接