2009-06-30 96 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) 

接受錯誤報告的意見;)