我在Python中使用子流程包来运行一个子流程,我稍后需要杀死它。但是,subprocess软件包的文档指出terminate()函数仅适用于2.6在Python 2.5中,我该如何杀死一个子进程?
我们使用2.5版Linux运行Linux,并且出于向下兼容性原因,我无法升级到2.6,有什么选择?我猜测这些函数是一些方便的方法。
我在Python中使用子流程包来运行一个子流程,我稍后需要杀死它。但是,subprocess软件包的文档指出terminate()函数仅适用于2.6在Python 2.5中,我该如何杀死一个子进程?
我们使用2.5版Linux运行Linux,并且出于向下兼容性原因,我无法升级到2.6,有什么选择?我猜测这些函数是一些方便的方法。
您在进程pid上调用os.kill。
os.kill(process.pid, signal.SIGKILL)
你没问题,因为你在Linux上。 Windows用户运气不佳。
要完成@加雷思的答案,在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)
优雅,但它的工作;-)
为了完成@加雷思的和@Alex答案,如果您不想打扰下层系统,则可以使用psutil。
psutil是通过使用Python, 执行许多功能 通过命令行工具,如提供用于检索上运行的一个 便携式方式的过程和系统 利用率(CPU,存储器)的信息 提供 接口的模块ps, 顶部,kill和Windows任务管理器。
它目前支持Linux,OS X, 的FreeBSD和Windows使用Python 2.4 版本3.1通过使用 独特的代码库。
那是一个副本& 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)
接受错误报告的意见;)
酷:如果我粘的答案在一起,我得到 '便携' 的代码! – Blauohr 2009-06-30 15:48:55
有一个已经胶粘的便携式答案http://stackoverflow.com/a/8536476/192632 – bogdan 2011-12-16 15:42:47