【问题标题】:In Python 2.5, how do I kill a subprocess?在 Python 2.5 中,我如何杀死一个子进程?
【发布时间】:2010-11-07 01:15:16
【问题描述】:

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

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

【问题讨论】:

标签: python subprocess


【解决方案1】:

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

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

您没问题,因为您使用的是 Linux。 Windows 用户不走运。

【讨论】:

  • os.kill(p.pid, signal.SIGTERM) 更准确
  • "kill 123" 发送 SIGTERM。 “kill -9 123”发送 SIGKILL。善待这个过程并先尝试 SIGTERM。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案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)
      

      接受错误报告作为 cmets ;)

      【讨论】:

        猜你喜欢
        • 2020-02-20
        • 2010-12-08
        • 2018-06-09
        • 2015-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多