Библиотека psutil предназначена для получения информации о запущенных процессах и использовании системы (процессор, память, диски, сеть).
Эта библиотека пригодится вам, если вы захотите получить какие-либо данные о конкретном процессе или комплектующих. Также появится возможность управлять ими в зависимости от их состояния.
Получение информации о комплектующих ПК с помощью библиотеки psutil
Какую же информацию можно получить? Можно достать данные о процессоре с момента загрузки, в том числе о том, сколько системных вызовов и контекстных переключателей он сделал:
In [1]: psutil.cpu_stats() Out[1]: scpustats( ctx_switches=437905181, interrupts=2222556355L, soft_interrupts=0, syscalls=109468308)
Также есть возможность извлечь информацию о диске и состоянии памяти:
In [1]: psutil.disk_usage("c:")Out[1]: sdiskusage(total=127950385152L, used=116934914048L, free=11015471104L, percent=91.4) In [2]: psutil.virtual_memory() Out[2]: svmem(total=8488030208L, available=3647520768L, percent=57.0, used=4840509440L, free=3647520768L)
Можно даже получить данные о времени автономной работы или узнать текущую температуру процессора:
In [1]: psutil.sensors_battery() Out[1]: sbattery(percent=77, secsleft=18305, power_plugged=False) In [2]: psutil.sensors_temperatures() # In Celsius Out[2]: {'ACPI\\ThermalZone\\THM0_0': [shwtemp(label='', current=49.05000000000001, high=127.05000000000001, critical=127.05000000000001)]}
Получение информации о процессах
Одной из самых классных фишек этой библиотеки является то, что можно получить доступ к процессам и их статистике. Однако есть процессы, которые требуют наличия прав администратора. В противном случае после попытки доступа произойдет сбой с ошибкой "AccessDenied". Давайте протестируем эту функцию.
Сначала создадим экземпляр, предоставляя требуемый идентификатор процесса:
In [1]: p = psutil.Process(9800)
Затем можно получить доступ ко всей информации и статистике процесса:
In [1]: p.exe() Out[1]: 'C:\\Windows\\System32\\dllhost.exe' In [2]: p.cpu_percent() Out[2]: 0.0 In [3]: p.cwd() Out[3]: 'C:\\WINDOWS\\system32'
Создадим функцию, которая связывает открытые порты соединений с процессами. Для начала нужно перебрать все открытые соединения.
In [1]: ps.net_connections? Signature: ps.net_connections(kind='inet') Docstring: Return system-wide socket connections as a list of (fd, family, type, laddr, raddr, status, pid) namedtuples. In case of limited privileges 'fd' and 'pid' may be set to -1 and None respectively. The *kind* parameter filters for connections that fit the following criteria: +------------+----------------------------------------------------+ | Kind Value | Connections using | +------------+----------------------------------------------------+ | inet | IPv4 and IPv6 | | inet4 | IPv4 | | inet6 | IPv6 | | tcp | TCP | | tcp4 | TCP over IPv4 | | tcp6 | TCP over IPv6 | | udp | UDP | | udp4 | UDP over IPv4 | | udp6 | UDP over IPv6 | | unix | UNIX socket (both UDP and TCP protocols) | | all | the sum of all the possible families and protocols | +------------+----------------------------------------------------+
Обратим внимание на то, что одним из возвращаемых атрибутов является "pid".
Можно связать это с именем процесса:
In [1]: def link_connection_to_process(): ...: for connection in ps.net_connections(): ...: try: ...: yield [ps.Process(pid=connection.pid).name(), ...: connection] ...: except ps.AccessDenied: ...: continue # Keep going if we don't have access
Но не стоит забывать, что если пользователь не обладает правами администратора, он не сможет получить доступ к определенным процессам. Проверим выходные данные. Он вернет много данных, поэтому выведем только первое значение:
In [1]: for proc_to_con in ps.net_connections(): ...: print proc_to_con ...: raw_input("...") ...: ['ManagementServer.exe', sconn(fd=-1, family=2, type=1, laddr=addr(ip='127.0.0.1', port=5905), raddr=addr(ip='127.0.0.1', port=49728), status='ESTABLISHED', pid=5224)] ...
Как можно увидеть, первое значение – это имя процесса, второй – данные соединения: IP-адрес, порт, статус и так далее. Данная функция очень полезна для понимания того, какие порты используются конкретными процессами.
Подведение итогов
Psutil – отличная библиотека, предназначенная для управления системой. Она полезна для управления ресурсами как частью потока кода.
Комментарии