Python lấy danh sách các ứng dụng đang chạy

PyCharm cho phép xem tất cả các ứng dụng đang chạy. Lệnh Show Running List của menu Run chỉ được bật nếu có ứng dụng đang hoạt động. Nếu không có ứng dụng nào đang hoạt động, lệnh sẽ chuyển sang màu xám

  • Từ menu chính, chọn Chạy. Hiển thị danh sách đang chạy. Ở góc trên cùng bên phải của trình chỉnh sửa, PyCharm hiển thị danh sách có tất cả các ứng dụng đang hoạt động

    Python lấy danh sách các ứng dụng đang chạy

Sửa đổi lần cuối. 28 tháng mười hai 2022

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách tìm và liệt kê tất cả các quy trình đang chạy trong Python. Nó là một chương trình rất đơn giản

Chương trình Python để tìm và liệt kê tất cả các quy trình đang chạy

Để làm điều này, chúng ta cần thư viện psutil. Hãy để chúng tôi cài đặt nó

pip install psutil

Bây giờ, chúng ta cần nhập nó vào chương trình của mình

import psutil

Chúng tôi có một phương thức gọi là process_iter để lặp lại tất cả các quy trình đang chạy. Phương thức này có trong thư viện psutil. Đó là lý do chúng tôi đã nhập nó vào chương trình của mình

c=0
for process in psutil.process_iter ():
    c=c+1
    Name = process.name () # Name of the process
    ID = process.pid # ID of the process
    print ("Process name =", Name ,",","Process ID =", ID)
print ("\nTotal number of running process are ", c)

Đối với mọi quy trình đang chạy, chúng tôi sẽ nhận được tên và ID của nó bằng cách sử dụng các phương thức tên và pid

Để đếm tổng số quy trình đang chạy, tôi đã sử dụng biến 'c' và tăng nó cho mỗi quy trình

đầu ra

Process name = System Idle Process , Process ID = 0
Process name = System , Process ID = 4
Process name = Registry , Process ID = 96
Process name = RuntimeBroker.exe , Process ID = 336
Process name = smss.exe , Process ID = 404
Process name = svchost.exe , Process ID = 448
Process name = csrss.exe , Process ID = 512
 . . . 
Process name = chrome.exe , Process ID = 8864
Process name = svchost.exe , Process ID = 8880
Process name = svchost.exe , Process ID = 8936
Process name = svchost.exe , Process ID = 8948
Process name = csrss.exe , Process ID = 8980
Process name = ApntEx.exe , Process ID = 9132

Total number of running process are 145

Đầu ra thay đổi từ hệ thống này sang hệ thống khác. Nó phụ thuộc vào các quy trình đang chạy tại thời điểm đó. Tại thời điểm này có 145 quy trình đang chạy trong hệ thống của tôi

Hôm trước, tôi được giao nhiệm vụ tìm cách lấy danh sách tất cả các tiến trình đang chạy trên máy ảo Windows XP. Tôi cũng phải bao gồm thông tin về lượng CPU và bộ nhớ mà mỗi tiến trình đã sử dụng. May mắn thay, đây không phải là một tập lệnh từ xa, mà là một tập lệnh có thể chạy trên máy khách. Sau một hồi tìm kiếm trên Google, cuối cùng tôi cũng tìm ra giải pháp. Trong bài viết này, chúng ta sẽ xem xét một số từ chối cũng như giải pháp cuối cùng, có thể hoạt động trên nhiều nền tảng

Một trong những kịch bản đầu tiên tôi tìm thấy là kịch bản này từ tháng 3 năm 2006

# http://mail.python.org/pipermail/python-win32/2006-March/004340.html
import win32com.client
wmi=win32com.client.GetObject('winmgmts:')
for p in wmi.InstancesOf('win32_process'):
    print p.Name, p.Properties_('ProcessId'), \
        int(p.Properties_('UserModeTime').Value)+int(p.Properties_('KernelModeTime').Value)
    children=wmi.ExecQuery('Select * from win32_process where ParentProcessId=%s' %p.Properties_('ProcessId'))
    for child in children:
        print '\t',child.Name,child.Properties_('ProcessId'), \
            int(child.Properties_('UserModeTime').Value)+int(child.Properties_('KernelModeTime').Value)

Tập lệnh này yêu cầu gói PyWin32 hoạt động. Tuy nhiên, mặc dù đó là một tập lệnh nhỏ tiện dụng nhưng nó không hiển thị bất cứ thứ gì tôi muốn ngoại trừ ProcessId. Tôi không thực sự quan tâm đến thời gian của chế độ người dùng hoặc kernel (tôi. e. tổng thời gian CPU theo người dùng hoặc kernel). Ngoài ra, tôi không thực sự thích làm việc với ma thuật đen của COM, vì vậy cuối cùng tôi đã từ chối cái này

Tiếp theo là một công thức ActiveState. Nó có vẻ đầy hứa hẹn

# http://code.activestate.com/recipes/303339-getting-process-information-on-windows/
import win32pdh, string, win32api

def procids():
    #each instance is a process, you can have multiple processes w/same name
    junk, instances = win32pdh.EnumObjectItems(None,None,'process', win32pdh.PERF_DETAIL_WIZARD)
    proc_ids=[]
    proc_dict={}
    for instance in instances:
        if instance in proc_dict:
            proc_dict[instance] = proc_dict[instance] + 1
        else:
            proc_dict[instance]=0
    for instance, max_instances in proc_dict.items():
        for inum in xrange(max_instances+1):
            hq = win32pdh.OpenQuery() # initializes the query handle 
            path = win32pdh.MakeCounterPath( (None,'process',instance, None, inum,'ID Process') )
            counter_handle=win32pdh.AddCounter(hq, path) 
            win32pdh.CollectQueryData(hq) #collects data for the counter 
            type, val = win32pdh.GetFormattedCounterValue(counter_handle, win32pdh.PDH_FMT_LONG)
            proc_ids.append((instance,str(val)))
            win32pdh.CloseQuery(hq) 

    proc_ids.sort()
    return proc_ids

print procids()

Than ôi, mặc dù điều này cũng cung cấp cho tôi một danh sách các quy trình từ hộp Windows của tôi (cùng với PID), nhưng nó không cung cấp cho tôi bất kỳ thông tin nào về việc sử dụng CPU và bộ nhớ. Tôi nghĩ cái này có thể hoạt động nếu tôi sử dụng các tên truy cập khác nhau. Tôi đoán nếu bạn muốn, bạn có thể tìm ra thông tin đó bằng MSDN. Tôi không muốn gây rối với điều đó, vì vậy tôi tiếp tục đào

Công thức đó dẫn tôi đến công thức sau dựa trên ctypes

# http://code.activestate.com/recipes/305279/

"""
Enumerates active processes as seen under windows Task Manager on Win NT/2k/XP using PSAPI.dll
(new api for processes) and using ctypes.Use it as you please.

Based on information from http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q175030&ID=KB;EN-US;Q175030

By Eric Koome
email [email protected]
license GPL
"""
from ctypes import *

#PSAPI.DLL
psapi = windll.psapi
#Kernel32.DLL
kernel = windll.kernel32

def EnumProcesses():
    arr = c_ulong * 256
    lpidProcess= arr()
    cb = sizeof(lpidProcess)
    cbNeeded = c_ulong()
    hModule = c_ulong()
    count = c_ulong()
    modname = c_buffer(30)
    PROCESS_QUERY_INFORMATION = 0x0400
    PROCESS_VM_READ = 0x0010
    
    #Call Enumprocesses to get hold of process id's
    psapi.EnumProcesses(byref(lpidProcess),
                        cb,
                        byref(cbNeeded))
    
    #Number of processes returned
    nReturned = cbNeeded.value/sizeof(c_ulong())
    
    pidProcess = [i for i in lpidProcess][:nReturned]
    
    for pid in pidProcess:
        
        #Get handle to the process based on PID
        hProcess = kernel.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                                      False, pid)
        if hProcess:
            psapi.EnumProcessModules(hProcess, byref(hModule), sizeof(hModule), byref(count))
            psapi.GetModuleBaseNameA(hProcess, hModule.value, modname, sizeof(modname))
            print "".join([ i for i in modname if i != '\x00'])
            
            #-- Clean up
            for i in range(modname._length_):
                modname[i]='\x00'
            
            kernel.CloseHandle(hProcess)

if __name__ == '__main__':
    EnumProcesses()

Điều này trông khá thông minh, nhưng tôi khá tệ trong việc phân tích cú pháp ctypes. Đó là thứ tôi muốn học, nhưng tôi đã có thời hạn, doggone nó. Ngoài ra, cái này chỉ hiển thị danh sách các quy trình đang chạy nhưng không có thông tin về chúng. May mắn thay, tác giả đã bao gồm một tài liệu tham khảo, nhưng tôi quyết định tiếp tục tìm kiếm

Tiếp theo, tôi tìm thấy một chuỗi về việc sử dụng mô-đun WMI tiện dụng của Tim Golden để thực hiện việc này (bên dưới được sao chép ngay từ chuỗi)

# http://mail.python.org/pipermail/python-win32/2003-December/001482.html
>>> processes = WMI.InstancesOf('Win32_Process')
>>> len(processes)
41
>>> [process.Properties_('Name').Value for process in processes] # get
the process names
[u'System Idle Process', u'System', u'SMSS.EXE', u'CSRSS.EXE',
u'WINLOGON.EXE', u'SERVICES.EXE', u'LSASS.EXE', u'SVCHOST.EXE',
u'SVCHOST.EXE', u'SVCHOST.EXE', u'SVCHOST.EXE', u'SPOOLSV.EXE',
u'ati2evxx.exe', u'BAsfIpM.exe', u'defwatch.exe', u'inetinfo.exe',
u'mdm.exe', u'rtvscan.exe', u'SCARDSVR.EXE', u'WLTRYSVC.EXE',
u'BCMWLTRY.EXE', u'EXPLORER.EXE', u'Apoint.exe', u'carpserv.exe',
u'atiptaxx.exe', u'quickset.exe', u'DSentry.exe', u'Directcd.exe',
u'vptray.exe', u'ApntEx.exe', u'FaxCtrl.exe', u'digstream.exe',
u'CTFMON.EXE', u'wuauclt.exe', u'IEXPLORE.EXE', u'Pythonwin.exe',
u'MMC.EXE', u'OUTLOOK.EXE', u'LineMgr.exe', u'SAPISVR.EXE',
u'WMIPRVSE.EXE']

Here is how to get a single process and get its PID.

>>> p = WMI.ExecQuery('select * from Win32_Process where
Name="Pythonwin.exe"')
>>> [prop.Name for prop in p[0].Properties_] # let's look at all the
process property names
[u'Caption', u'CommandLine', u'CreationClassName', u'CreationDate',
u'CSCreationClassName', u'CSName', u'Description', u'ExecutablePath',
u'ExecutionState', u'Handle', u'HandleCount', u'InstallDate',
u'KernelModeTime', u'MaximumWorkingSetSize', u'MinimumWorkingSetSize',
u'Name', u'OSCreationClassName', u'OSName', u'OtherOperationCount',
u'OtherTransferCount', u'PageFaults', u'PageFileUsage',
u'ParentProcessId', u'PeakPageFileUsage', u'PeakVirtualSize',
u'PeakWorkingSetSize', u'Priority', u'PrivatePageCount', u'ProcessId',
u'QuotaNonPagedPoolUsage', u'QuotaPagedPoolUsage',
u'QuotaPeakNonPagedPoolUsage', u'QuotaPeakPagedPoolUsage',
u'ReadOperationCount', u'ReadTransferCount', u'SessionId', u'Status',
u'TerminationDate', u'ThreadCount', u'UserModeTime', u'VirtualSize',
u'WindowsVersion', u'WorkingSetSize', u'WriteOperationCount',
u'WriteTransferCount']
>>> p[0].Properties_('ProcessId').Value # get our ProcessId
928

Đây là một số nội dung thú vị và tôi sử dụng các mô-đun của Golden trong một số mã khác của mình. Tuy nhiên, tôi vẫn chưa chắc chắn nên sử dụng quầy nào để lấy thông tin của mình. Tôi nghĩ rằng hầu hết những thứ này sẽ chỉ được mã hóa cho tôi hoặc một cái gì đó. Chà, hóa ra là có một gói thực hiện chính xác những gì tôi cần VÀ nó hoạt động trên cả ba nền tảng chính. Kinh ngạc

Giải pháp đa nền tảng

Tên của gói là psutil và đó là tên tôi quyết định sử dụng. Đây là những gì tôi đã kết thúc với

________số 8

Vâng, đó là một vòng lặp vô hạn và vâng, đó thường là một điều rất tồi tệ (ngoại trừ trong lập trình GUI). Tuy nhiên, với mục đích của mình, tôi cần một cách để kiểm tra quy trình của người dùng cứ sau 5 phút hoặc lâu hơn để xem điều gì đã khiến máy hoạt động kỳ lạ như vậy. Do đó, tập lệnh cần chạy mãi mãi và ghi kết quả vào các tệp có tên duy nhất. Đó là tất cả những gì tập lệnh này làm, cùng với một chút phép thuật định dạng. Hãy sử dụng nó hoặc không khi bạn thấy phù hợp

Tôi hy vọng bạn thấy bộ sưu tập tài liệu này hữu ích. Hy vọng rằng nó sẽ giúp bạn tiết kiệm tất cả những gì tôi đã trải qua

Ghi chú. Mặc dù tập lệnh cuối cùng này dường như chỉ hoạt động tốt trên Windows XP, nhưng trên Windows 7 32 và 64-bit, bạn sẽ nhận được thông báo truy nguyên "Truy cập bị từ chối", tôi nghi ngờ điều này là do tính bảo mật được tăng cường của Window 7, nhưng tôi sẽ cố gắng tìm một

CẬP NHẬT (09/10/2010) - Những người dùng psutil không biết tại sao nó không hoạt động, nhưng một trong những nhà phát triển của họ đã xác nhận sự cố. Bạn có thể theo dõi trên danh sách Google Groups của họ

Làm cách nào để lấy PID trong python?

Chúng tôi có thể lấy pid cho quy trình hiện tại thông qua hệ điều hành. hàm getpid() . Chúng tôi cũng có thể lấy pid cho quy trình gốc thông qua hệ điều hành. hàm getppid().

ps trong python là gì?

Giới thiệu. Mô-đun PSFile Python giúp bạn tạo các tệp PostScript từ các tập lệnh Python . PSFile có thể tạo các trình bao bọc cần thiết để thiết lập hình dạng trang; .

Làm cách nào để kiểm tra quy trình python trong Ubuntu?

Kiểm tra tiến trình đang chạy trong Ubuntu .
Mở cửa sổ terminal trên Ubuntu
Đối với máy chủ Ubuntu từ xa, hãy sử dụng lệnh ssh để đăng nhập
Gõ lệnh ps aux để xem toàn bộ tiến trình đang chạy trong Ubuntu
Ngoài ra, bạn có thể ra lệnh top để xem tiến trình đang chạy trong Ubuntu