我正在使用 Python 中的 subprocess 包来运行一个子进程,稍后我需要将其杀死。但是, subprocess 包的文档指出 terminate() 函数仅在 2.6 中可用
我们正在使用 2.5 运行 Linux,出于向后兼容性的原因,我无法升级到 2.6,有什么替代方案?我猜这些函数是一些方便的方法。
我正在使用 Python 中的 subprocess 包来运行一个子进程,稍后我需要将其杀死。但是, subprocess 包的文档指出 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)
,但它确实有效;-)
为了完成@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)
接受错误报告作为评论;)