Windows下如何獲取與手機設備有關的進程信息(Python版)

        當電腦上插有多臺手機,我們對手機進行自動化測試,必然會執行adb  shell命令,有時代碼不能很好的對adb進程進行回收,導致電腦上會殘留大量的adb進程,每個adb進程都會佔用電腦少量內存,adb數量多的時候,佔用的內存也是驚人的,會導致電腦響應速度變慢等問題。因此,我們需要定期將電腦上的adb進程給殺死掉。


        現在我們面臨一個問題,如何殺死一臺手機的adb命令而不影響另外一臺手機的adb shell命令的正常執行呢?一臺機器我們可以執行如下代碼:

os.system('taskkill /IM adb.exe /F')
        這行代碼會殺死所有的adb進程。如果是多臺手機設備,會對其他的機器產生影響。我們在任務管理器裏面對進程選擇管理行,那樣我們就能看到adb進程詳細的信息,如下圖所示:


        那麼,我們有沒有辦法獲取這些adb進程詳細信息呢?答案是肯定的。可以通過psutil這個模塊來搞定。在Python代碼中,我們使用import psutil即可。但是導入這個模塊時,我們必須安裝該模塊,我使用的是psutil-3.4.2.win32-py3.3.exe,這個應用程序名字比較特別,但又充分顯示其信息。psutil-3.4.2表明psutil的版本爲3.4.2,在Windows 32位環境下使用,相應的Python應用程序版本爲3.3,不然使用的時候會出錯,這個就不再詳細說明。

        話不多說,我們直接貼代碼:

def killDevicePid(device):
    filterstr1='adb'
    filterstr2=device
    for proc in psutil.process_iter():
        try:
            pinfo = proc.as_dict(attrs=['pid', 'name'])
            pid = pinfo['pid']
            if ((filterstr1 in proc.cmdline()) and (filterstr2 in proc.cmdline())):
                # print(filterstr)
                killcmd = 'taskkill /PID ' + str(pid) + ' /F'
                try:
                    os.system(killcmd)
                    print(killcmd)
                except OSError as e:
                    print('no process.')
        except psutil.NoSuchProcess:
            pass
        except ProcessLookupError:
            pass
        except psutil.AccessDenied:
            pass
        finally:
            del pinfo
            del proc 
        其中,device爲機器的設備號,我們根據設備號來殺死相應機器的所有adb進程。psutil.process_iter()這個是獲取到電腦上所有進程信息,然後對其進程遍歷,得到各個進程的pid和name。proc.cmdline()爲進程的命令行信息,如上圖所示,我們可以判斷該命令行信息是否含有機器設備號和adb進程,如果都含有的話,我們可以通過taskkill命令和adb進程的pid來殺死adb進程。這樣,我們就能對某一臺設備的adb進程進行kill,而不影響其他設備的adb shell進程的正常執行。

        目前爲止,我講完了,今後大家如果想獲取與設備進程相關的信息,或者想對進程進程控制,都可以使用該文的相關方法。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章