2009-06-30 172 views
28

我在Python中使用子流程包来运行一个子流程,我稍后需要杀死它。但是,subprocess软件包的文档指出terminate()函数仅适用于2.6在Python 2.5中,我该如何杀死一个子进程?

我们使用2.5版Linux运行Linux,并且出于向下兼容性原因,我无法升级到2.6,有什么选择?我猜测这些函数是一些方便的方法。

+1

酷:如果我粘的答案在一起,我得到 '便携' 的代码! – Blauohr 2009-06-30 15:48:55

+1

有一个已经胶粘的便携式答案http://stackoverflow.com/a/8536476/192632 – bogdan 2011-12-16 15:42:47

回答

40

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

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

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

40

要完成@加雷思的答案,在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)优雅,但它的工作;-)

6

为了完成@加雷思的和@Alex答案,如果您不想打扰下层系统,则可以使用psutil

psutil是通过使用Python, 执行许多功能 通过命令行工具,如提供用于检索上运行的一个 便携式方式的过程和系统 利用率(CPU,存储器)的信息 提供 接口的模块ps, 顶部,kill和Windows任务管理器。

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

4

那是一个副本& PASE完整的解决方案:

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) 

接受错误报告的意见;)