python獲取進程pid并且殺掉進程

python程序退出方式

  • sys.exit()
    執行該語句會直接退出程序,這也是經常使用的方法,也不需要考慮平臺等因素的影響,一般是退出Python程序的首選方法。
    該方法中包含一個參數status,默認為0,表示正常退出,也可以為1,表示異常退出。
import sys
sys.exit()
sys.exit(0)
sys.exit(1)
  • os._exit()
    效果也是直接退出,不會拋出異常,但是其使用會受到平臺的限制,但我們常用的Win32平臺和基于UNIX的平臺不會有所影響。

  • os.kill()
    一般用于直接Kill掉進程,但是只能在UNIX平臺上有效。

  • Windows下Kill進程
    既然在Linux下能夠進行上述操作,那么Windows下也能夠有相關的操作。
    這里使用的是os.popen(), 該方法是用于直接執行系統命令,而在Windows下其實就是使用taskkill來kill掉進程,其基本形式是,
    taskkill /pid 程序的PID號碼

import os
if __name__ == "__main__":
    pid = 620
    os.popen('taskkill.exe /pid:'+str(pid))

這里我們采取第四種方式,獲取進程的pid,然后執行cmd命令

def getChildrenPidsOfPid():
    """Returns the children pids of a pid"""
    newpidcnt = 0
    pid = 0
    wmi = win32com.client.GetObject('winmgmts:')
    for win32_process_instance in wmi.InstancesOf('win32_process'):
            if win32_process_instance.Name and win32_process_instance.Name.upper() == "HuaYang.exe".upper():
                pTime = win32_process_instance.Properties_('CreationDate').Value
                processId = int(win32_process_instance.Properties_('ProcessId'))
                if pTime > 5:
                    newpidcnt = newpidcnt + 1
                    pid = processId
    if newpidcnt > 2:
        raise RuntimeError("error")
    print pid
    return pid

def kill(pid):
    try:
        # command = 'taskkill /F /IM %d' %pid
        # print type(command)
        # os.system(command) #1111
        import subprocess  
        subprocess.Popen("cmd.exe /k taskkill /F /T /PID %i"%pid , shell=True)  
    except OSError, e:
        print 'no process'

執行111處時,會出現提示Decode error - output not utf-8
具體原因:

python在編譯運行源碼后,默認將輸出結果以cp936編碼,發送給Sublime Text。而Sublime Text 中python build的默認接收編碼是UTF-8。Sublime Text在接收到python輸出后,試圖以utf-8解碼cp936編碼的流。當cp936編碼的流中沒有漢字時,因為英文字符集在cp936和utf-8中的編碼兼容,所以用utf-8解碼不會出錯;當cp936編碼的流中有漢字時,因為漢字字符集在cp936與utf-8的編碼不兼容,所以用utf-8解碼就會錯誤。最終Sublime Text就會報[Decode error - output not utf-8]錯誤。

解決方法:

方法1. Python有個PythonIoEncoding環境變量,用來定義stdin/stdout/stderr的編碼。windows下,cmd中執行python -h 可以看到該環境變量的說明。所以可以在環境變量下,添加一個環境變量pythonioencoding,值為utf-8,即可解決該問題。
方法2.修改Sublime Text的python build的設置。將其編碼設置為cp936。
1.先找到Python.sublime-build文件,Preferences->Browse Packages,打開目錄

打開目錄

2.進入對應語言目錄,找到*.sublime-build文件,并按截圖添加語句

添加cp936

sublime執行cmd命令時,經常會碰到 不是內部

Paste_Image.png

后來換一個IDE就可以,估計是sublime這里對cmd命令的權限有點問題。如果哪位知道怎么回事,可以聯系我怎么回事。

  • 查詢windows的pid 并且殺掉進程
    查看占用指定端口的程序 **
    netstat –ano|findstr “指定端口號”
    如:
    查詢占用了8080端口的進程:netstat -ano|findstr "8080"**
    使用命令殺死進程1>首先找到進程號對應的進程名稱tasklist|findstr 進程號如:tasklist|findstr 3112
    然后根據進程名稱殺死進程taskkill /f /t /im 進程名稱如:taskkill /f /t /im /javaw.exe

執行系統命令的幾種方式:

  • os.system()
    import os
    cmd = 'ipconfig'
    os.system(cmd)

  • class subprocess.Popen
    import subprocess
    subprocess.Popen(command, shell=True)
    如果command不是一個可執行文件,shell=True不可省。

  • 打開網頁
    import webbrowser
    webbrowser.open('http://www.google.com')

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 字符集和編碼簡介 在編程中常常可以見到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說...
    蘭山小亭閱讀 8,614評論 0 13
  • 個人學習批處理的初衷來源于實際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求,從而在測試過程中就重復涉及到...
    Luckykailiu閱讀 4,779評論 0 11
  • 本節內容 Python介紹 發展史 Python 2 or 3? 安裝 Hello World程序 變量 用戶輸入...
    小小不懂11閱讀 3,448評論 2 30
  • 幾個基本概念 bit二進制位, 是計算機內部數據儲存的最小單位,11010100是一個8位二進制數。一個二進制位只...
    西電大俠閱讀 3,600評論 1 8
  • 常用 提高python編碼效率 賦值 列表推導式 列表解析表達式,類似[i*2 for i in list] 三元...
    今夕何夕_walker閱讀 770評論 0 1