我在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