python進行系統相關操作時都有點力不從心,尤其是windows下,比如獲取進程的cpu、內存等等,可以通過以下方法可以達到這種要求:
1、安裝pywin32、psutil這種第三方庫,里面提供了很多相關的api
2、用c++寫,編譯成dll,把相關api導出,讓python去調用
3、通過ctypes去調用windows api實現
psutil是跨平台的,不過功能比較弱,舉幾個例子
##根據進程名獲取PID
def nametopid(x):
num=[]
for r in psutil.process_iter():
aa = str(r)
f = re.compile(x,re.I)
if f.search(aa):
num.append( aa.split('pid=')[1].split(',')[0] )
return num
print nametopid('chrome')
##根據進程名獲取進程全路徑
def nametopath(x):
num=[]
for i in nametopid(x):
num.append(psutil.Process(int(i)).exe())
return num
print nametopath('notepad')
##根據PID獲取進程名
def pidtoname(x):
return psutil.Process(int(x)).name()
# print pidtoname('sasa')
##根據PID獲取進程全路徑
def pidtopath(x):
return psutil.Process(int(x)).exe()
# print pidtopath('1280')
##殺進程
def killprocess(x):
if x.isdigit():
psutil.Process(int(x)).terminate()
else:
for i in nametopid(x):
psutil.Process(int(i)).terminate()
# killprocess('notepad')
# killprocess('1111')
##殺進程樹
def killprocesstree(x):
if x.isdigit():#根據pid殺
for pid in psutil.pids():
if psutil.Process(int(pid)).ppid()==int(x):
psutil.Process(int(pid)).terminate()
psutil.Process(int(x)).terminate()
else:#根據進程名殺
try:
for pid in psutil.pids():#殺子進程
if str(psutil.Process(int(pid)).ppid()) in nametopid(x): #if 'a' in theList:
psutil.Process(int(pid)).terminate()
for i in nametopid(x):#殺父進程
psutil.Process(int(i)).terminate()
except Exception,info:
return "input the right pname!"
# killprocesstree('procexp.exe')
##獲取進程內存占用 , psutil does not expose the private working set
def getprocessmem(x):
if x.isdigit():
return psutil.Process(int(x)).memory_info()
else:
for i in nametopid(x):
return psutil.Process(int(i)).memory_info()
# print getprocessmem('236')
##獲取進程CPU占用
def getprocesscpu(x):
if x.isdigit():
return psutil.Process(int(x)).cpu_percent(interval=1.0) / psutil.cpu_count()
else:
num=[]
for i in nametopid(x):
num.append(psutil.Process(int(i)).cpu_percent(interval=1.0) / psutil.cpu_count() )
return num
