结束使用Python的subprocess.Popen()创建的进程

86 投票
4 回答
203273 浏览
提问于 2025-04-16 06:28

这是我的想法:

首先,我是通过使用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

再次感谢大家。

我仍在等待你们宝贵的经验来解决这个棘手的问题。

4 个回答

13

只使用 Popen 的杀死方法

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

process.terminate() 在使用 shell=True 时不起作用。这个 回答 会对你有帮助。

55

在你的代码中应该是这样的

proc1.kill()

这里的 killterminate 都是 Popen 对象的方法。简单来说,Popen 就是用来启动和管理其他程序的工具。在 macOS 和 Linux 系统上,kill 会向进程发送一个叫做 signal.SIGKILL 的信号,这个信号会强制结束进程。而 terminate 则发送的是 signal.SIGTERM,这个信号是请求进程自己结束,给它一个机会去清理资源。在 Windows 系统上,这两个方法都会调用 Windows 的 TerminateProcess() 函数来结束进程。

撰写回答