我在Python中使用子进程包来运行子进程,我后来需要杀死它。但是,子进程包的文档声明terminate()函数仅在2.6
中可用我们使用2.5运行Linux,出于向后兼容性原因,我无法升级到2.6,有什么替代方案?我猜这些函数是方便的东西。
答案 0 :(得分:41)
你在进程pid上调用os.kill。
os.kill(process.pid, signal.SIGKILL)
你很好,因为你在Linux上。 Windows用户运气不佳。
答案 1 :(得分: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)
那么优雅,但确实有用; - )
答案 2 :(得分:6)
为了完成@ Gareth和@Alex的答案,如果您不想打扰底层系统,可以使用psutil。
psutil是一个提供的模块 用于检索信息的界面 在运行流程和系统上 利用率(CPU,内存) 使用Python的便携方式, 实现许多功能 由ps等命令行工具提供 top,kill和Windows任务管理器。
它目前支持Linux,OS X, FreeBSD和Windows用Python 版本从2.4到3.1使用a 独特的代码库。
答案 3 :(得分: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)
接受错误报告作为评论;)