【问题标题】:Killing a process created with Python's subprocess.Popen() [duplicate]杀死使用 Python 的 subprocess.Popen() 创建的进程 [重复]
【发布时间】:2011-05-04 07:34:10
【问题描述】:

这是我的想法:

首先,我使用 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)

但是,“proc1”在 Popen.kill() 之后仍然存在。 有高手能告诉我如何解决这个问题吗? 感谢您的考虑。

感谢所有专家的cmets,我按照你的建议做了,但结果还是一样。

proc1.kill() #it sill cannot kill the proc1

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

谢谢大家。

我还在等待您解决这个棘手问题的宝贵经验。

【问题讨论】:

标签: python popen


【解决方案1】:

使用 os.kill 怎么样?在此处查看文档:http://docs.python.org/library/os.html#os.kill

【讨论】:

  • 谢谢,但是 "os.kill(proc1.pid, signal.SIGTERM)" 或 "os.kill(proc1.pid, signal.SIGKILL)" 不起作用..
【解决方案2】:

在你的代码中应该是

proc1.kill()

killterminate 都是 Popen object 的方法。在 macOS 和 Linux 上,kill 向进程发送信号 signal.SIGKILLterminate 发送 signal.SIGTERM。在 Windows 上,它们都调用 Windows 的 TerminateProcess() 函数。

【讨论】:

  • 首先谢谢。不过这个我试过了,还是不行……
  • kill()terminate() 是不同的 kill 方法发送一个 SIGKILL 信号,其中 terminate 方法发送一个 SEGTERM 信号。不同之处在于前者从字面上终止进程,而后者仅停止进程。
【解决方案3】:

只使用Popenkill方法

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

【讨论】:

  • 这确实有效,直到我在“process.kill()”前面加上“time.sleep(x)”..
【解决方案4】:

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

【讨论】:

  • 非常感谢,您的回答结束了我3小时的调试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多