繁体   English   中英

在Python 2.5中,如何杀死子进程?

[英]In Python 2.5, how do I kill a subprocess?

我在Python中使用子进程包来运行子进程,我后来需要杀死它。 但是,子进程包的文档声明terminate()函数仅在2.6中可用

我们使用2.5运行Linux,出于向后兼容的原因,我无法升级到2.6,有什么替代方案? 我猜这些函数是方便的东西。

你在进程pid上调用os.kill。

os.kill(process.pid, signal.SIGKILL)

你很好,因为你在Linux上。 Windows用户运气不好。

要完成@ Gareth的答案,请在Windows上执行以下操作:

import ctypes
PROCESS_TERMINATE = 1
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, theprocess.pid)
ctypes.windll.kernel32.TerminateProcess(handle, -1)
ctypes.windll.kernel32.CloseHandle(handle)

不像os.kill(theprocess.pid, 9)那样优雅( os.kill(theprocess.pid, 9) ,但确实有效;-)

为了完成@ Gareth和@Alex的答案,如果您不想打扰底层系统,可以使用psutil

psutil是一个模块,提供了一个接口,用于通过使用Python以可移植的方式检索有关正在运行的进程和系统利用率(CPU,内存)的信息,实现命令行工具(如ps,top,kill和Windows任务管理器)提供的许多功能。

它目前支持Linux,OS X,FreeBSD和Windows,使用2.4到3.1的Python版本,使用独特的代码库。

这是一个复制和完整的解决方案:

def terminate_process(pid):
    # all this shit is because we are stuck with Python 2.5 and 
    # we cannot use Popen.terminate()
    if sys.platform == 'win32':
        import ctypes
        PROCESS_TERMINATE = 1
        handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, pid)
        ctypes.windll.kernel32.TerminateProcess(handle, -1)
        ctypes.windll.kernel32.CloseHandle(handle)
    else:
        os.kill(pid, signal.SIGKILL)

接受错误报告作为评论;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM