
Содержание статьи
автор Ори Роза

Модуль psutil Python обеспечивает интерфейс со всеми ресурсами и ПК.
Этот модуль очень полезен, если мы хотим получить некоторые данные об определенном ресурсе или управлять ресурсом в соответствии с его состоянием.
В этой статье я покажу вам основные возможности этого модуля и как ими пользоваться.
Получение информации о ресурсах ПК
Давайте посмотрим, как мы можем получить кое-какую информацию о текущем состоянии системы нашего ПК.
Мы можем получить некоторую информацию о процессоре с момента загрузки, включая количество системных вызовов и переключений контекста:
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 CelsiusOut[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'
Давайте создадим функцию, связывающую открытые порты соединений с процессами.
Поначалу нам необходимо повторить все открытые соединения. ps.net_connections
это именно то, что нам нужно!
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 -1and None respectively.The *kind* parameter filters for connections that fit thefollowing 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 |+------------+----------------------------------------------------+
Мы видим, что одним из атрибутов, возвращаемых net_connections, является «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
Мы должны помнить, что если у нас нет прав root, мы не можем получить доступ к отдельным процессам. Поэтому нам нужно обратить его в оператор try-catch для обработки ошибки «AccessDenied».
Давайте проверим выход.
Он выведет много данных, поэтому давайте напечатаем первый член:
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 – это отличная библиотека для управления системой. Это полезно для управления ресурсами как частью потока кода.
Надеюсь, эта статья научила вас чему-то новому, и я с нетерпением жду ваших отзывов. Скажите, пожалуйста, было ли это полезно для вас?