28

我正在使用 Python 中的 subprocess 包来运行一个子进程,稍后我需要将其杀死。但是, subprocess 包的文档指出 terminate() 函数仅在 2.6 中可用

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

4

4 回答 4

41

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

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

你没问题,因为你在 Linux 上。Windows 用户不走运。

于 2009-06-30T15:32:06.420 回答
40

要完成@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),但它确实有效;-)

于 2009-06-30T15:41:43.217 回答
6

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

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

它目前通过使用独特的代码库支持 Linux、OS X、FreeBSD 和 Windows 以及从 2.4 到 3.1 的 Python 版本。

于 2011-02-22T15:22:36.677 回答
4

那是一个复制和粘贴完整的解决方案:

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)

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

于 2011-12-16T15:40:08.203 回答