zoukankan      html  css  js  c++  java
  • windows平台下如何用Python杀进程

     
     
    #from : http://www.joyloft.net/?p=1031
    # "这段代码来自于一个很简单的场景:
    #  在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"
     
    作者:wenhai_zhang 发表于2009-12-14 20:06:00 原文链接
    阅读:35 评论:0 查看评论
  • 相关阅读:
    traceroute tracert 路由器地址 清单 192.168.2.1 网关路由器地址
    /usr/local/nginx/sbin/nginx -s reload 失败原因pid 进程记录和当前不符
    Nginx应用-Location路由反向代理及重写策略 请求转发-URL匹配规则 NGINX Reverse Proxy
    (转载)你好,C++(1)C++是什么?C++的“前世今生”
    (原创)cocos2d-x 3.0 示例代码分析5:testBasic
    (原创)cocos2d-x 3.0 示例代码分析4:VisibleRect
    (原创)cocos2d-x 3.0 示例代码分析3:BaseTest
    (摘要)100个伟大的商业理念:理念35:引爆流行
    (摘要)100个伟大的商业理念:理念34:企业社会责任
    (摘要)100个伟大的商业理念:理念32:重新改造
  • 原文地址:https://www.cnblogs.com/wenhaizhang/p/2099165.html
Copyright © 2011-2022 走看看