Пожаловаться

Как узнать температуру процессора с помощью psutil в Python

7011
Пожаловаться

Библиотека psutil предназначена для получения информации о запущенных процессах и использовании системы (процессор, память, диски, сеть).


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 – отличная библиотека, предназначенная для управления системой. Она полезна для управления ресурсами как частью потока кода.

Оригинал

Другие материалы по теме:

7011

Комментарии

Рекомендуем