用Python殺掉windows平臺下的進程

ccpp 9年前發布 | 3K 次閱讀 Python

# "這段代碼來自于一個很簡單的場景:

在python中調一個程序。給這個程序設置一個timeout

假如一段時間程序還沒有返回,就殺掉這個這個新開的進程。"

import ctypes import sys

TH32CS_SNAPPROCESS = 0x00000002 class PROCESSENTRY32(ctypes.Structure): fields = [("dwSize", ctypes.c_ulong), ("cntUsage", ctypes.c_ulong), ("th32ProcessID", ctypes.c_ulong), ("th32DefaultHeapID", ctypes.c_ulong), ("th32ModuleID", ctypes.c_ulong), ("cntThreads", ctypes.c_ulong), ("th32ParentProcessID", ctypes.c_ulong), ("pcPriClassBase", ctypes.c_ulong), ("dwFlags", ctypes.c_ulong), ("szExeFile", ctypes.c_char * 260)]

def getProcList(): CreateToolhelp32Snapshot = ctypes.windll.kernel32.CreateToolhelp32Snapshot Process32First = ctypes.windll.kernel32.Process32First Process32Next = ctypes.windll.kernel32.Process32Next CloseHandle = ctypes.windll.kernel32.CloseHandle hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) pe32 = PROCESSENTRY32() pe32.dwSize = ctypes.sizeof(PROCESSENTRY32) if Process32First(hProcessSnap,ctypes.byref(pe32)) == False: print >> sys.stderr, "Failed getting first process." return while True: yield pe32 if Process32Next(hProcessSnap,ctypes.byref(pe32)) == False: break CloseHandle(hProcessSnap)

def getChildPid(pid): procList = getProcList() for proc in procList: if proc.th32ParentProcessID == pid: yield proc.th32ProcessID

def killPid(pid): childList = getChildPid(pid) for childPid in childList: killPid(childPid) handle = ctypes.windll.kernel32.OpenProcess(1, False, pid) ctypes.windll.kernel32.TerminateProcess(handle,0)

if name =='main': args = sys.argv if len(args) >1 : pid = int(args[1]) killPid(pid) else: procList = getProcList() for proc in procList: print proc.szExeFile+' '+str(proc.th32ParentProcessID) + ' '+str(proc.th32ProcessID)

----------------------

#

Usage demo

#

----------------------

import subprocess import time

import winproc

timeout = 2 process = subprocess.Popen("cmd /k ping localhost -t",shell = True) start = int(time.time()) while process.poll()==None: now = int(time.time()) if int (now - start) >timeout: pid = process.pid break

winproc.killPid(pid)

print "End"</pre>

 本文由用戶 ccpp 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!