杀死使用Python的subprocess.Popen()创建的进程

use*_*511 51 python popen

这是我的想法:

首先,我使用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)
Run Code Online (Sandbox Code Playgroud)

但是,"proc1"仍然存在于Popen.kill()之后.任何专家都可以告诉我如何解决这个问题吗?我很感激你的考虑.

感谢所有专家的评论,我做了你所做的一切,但结果仍然保持不变.

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

os.kill(proc1.pid, signal.SIGKILL) # either cannot kill the proc1
Run Code Online (Sandbox Code Playgroud)

谢谢你们.

我仍然在等待你解决这个微妙问题的宝贵经验.

pyf*_*unc 29

在你的代码中它应该是

proc1.kill()
Run Code Online (Sandbox Code Playgroud)

两者killterminate都是Popen将信号发送signal.SIGKILL到进程的对象的方法.

  • 先谢谢 但是,我试过这个,它仍然无法正常工作...... (17认同)
  • `kill()`和`terminate()`不同kill方法发送一个SIGKILL信号,其中terminate方法发送一个SEGTERM信号.不同之处在于前者它实际上终止了后者,后者只停止了这个过程. (3认同)
  • 这不起作用 (2认同)

met*_*ia5 14

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

  • 非常感谢,您的回答结束了我 3 小时的调试 (3认同)

Jor*_* R. 8

只使用Popenkill方法

process = subprocess.Popen(
    task.getExecutable(), 
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE, 
    shell=True
)
process.kill()
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用 (3认同)
  • 这确实有效,直到我在"process.kill()"前加上"time.sleep(x)". (2认同)

Mic*_*son 0

使用 os.kill 怎么样?请参阅此处的文档:http ://docs.python.org/library/os.html#os.kill

  • 谢谢,但是“os.kill(proc1.pid, signal.SIGTERM)”或“os.kill(proc1.pid, signal.SIGKILL)”不起作用。 (6认同)