| |下载量| |星标数| |分叉数| |贡献者| |覆盖率| | |版本| |Python版本| |软件包| |许可证| | |GitHub Actions - wheels| |GitHub Actions - BSD| |AppVeyor| |文档| |Twitter| |Tidelift|
.. |下载量| image:: https://img.shields.io/pypi/dm/psutil.svg :target: https://pepy.tech/project/psutil :alt: 下载量
.. |星标数| image:: https://img.shields.io/github/stars/giampaolo/psutil.svg :target: https://github.com/giampaolo/psutil/stargazers :alt: GitHub 星标
.. |分叉数| image:: https://img.shields.io/github/forks/giampaolo/psutil.svg :target: https://github.com/giampaolo/psutil/network/members :alt: GitHub 分叉
.. |贡献者| image:: https://img.shields.io/github/contributors/giampaolo/psutil.svg :target: https://github.com/giampaolo/psutil/graphs/contributors :alt: 贡献者
.. |GitHub Actions - wheels| image:: https://img.shields.io/github/actions/workflow/status/giampaolo/psutil/.github/workflows/build.yml.svg?label=Linux%2C%20macOS%2C%20Windows :target: https://github.com/giampaolo/psutil/actions?query=workflow%3Abuild :alt: Linux, macOS, Windows
.. |GitHub Actions - BSD| image:: https://img.shields.io/github/actions/workflow/status/giampaolo/psutil/.github/workflows/bsd.yml.svg?label=FreeBSD,%20NetBSD,%20OpenBSD :target: https://github.com/giampaolo/psutil/actions?query=workflow%3Absd-tests :alt: FreeBSD, NetBSD, OpenBSD
.. |AppVeyor| image:: https://img.shields.io/appveyor/build/giampaolo/psutil/master.svg?maxAge=3600&label=Windows%20(py2) :target: https://ci.appveyor.com/project/giampaolo/psutil :alt: Windows (Appveyor)
.. |覆盖率| image:: https://coveralls.io/repos/github/giampaolo/psutil/badge.svg?branch=master :target: https://coveralls.io/github/giampaolo/psutil?branch=master :alt: 测试覆盖率 (coverall.io)
.. |文档| image:: https://readthedocs.org/projects/psutil/badge/?version=latest :target: https://psutil.readthedocs.io/en/latest/ :alt: 文档状态
.. |版本| image:: https://img.shields.io/pypi/v/psutil.svg?label=pypi :target: https://pypi.org/project/psutil :alt: 最新版本
.. |Python版本| image:: https://img.shields.io/pypi/pyversions/psutil.svg :alt: 支持的Python版本
.. |软件包| image:: https://repology.org/badge/tiny-repos/python:psutil.svg :target: https://repology.org/metapackage/python:psutil/versions :alt: 二进制包
.. |许可证| image:: https://img.shields.io/pypi/l/psutil.svg :target: https://github.com/giampaolo/psutil/blob/master/LICENSE :alt: 许可证
.. |Twitter| image:: https://img.shields.io/twitter/follow/grodola.svg?label=follow&style=flat&logo=twitter&logoColor=4FADFF :target: https://twitter.com/grodola :alt: Twitter关注
.. |Tidelift| image:: https://tidelift.com/badges/github/giampaolo/psutil?style=flat :target: https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme :alt: Tidelift
.. raw:: html
<div align="center">
<a href="https://github.com/giampaolo/psutil"><img src="https://yellow-cdn.veclightyear.com/0a4dffa0/4e8280a6-d125-4bab-b403-c9b78e093fe5.png" /></a>
<br />
<br />
<a href="https://github.com/giampaolo/psutil"><b>主页</b></a>
<a href="https://github.com/giampaolo/psutil/blob/master/INSTALL.rst"><b>安装</b></a>
<a href="https://psutil.readthedocs.io/"><b>文档</b></a>
<a href="https://pypi.org/project/psutil/#files"><b>下载</b></a>
<a href="https://groups.google.com/g/psutil"><b>论坛</b></a>
<a href="https://gmpy.dev/tags/psutil"><b>博客</b></a>
<a href="#funding"><b>资助</b></a>
<a href="https://github.com/giampaolo/psutil/blob/master/HISTORY.rst"><b>新功能</b></a>
</div>
概述
psutil(进程和系统实用工具)是一个跨平台的Python库,用于获取有关运行中的进程和系统使用情况(CPU、内存、磁盘、网络、传感器)的信息。它主要用于系统监控、性能分析和限制进程资源以及管理运行中的进程。它实现了许多经典UNIX命令行工具提供的功能,如ps、top、iotop、lsof、netstat、ifconfig、free等。psutil目前支持以下平台:
- Linux
- Windows
- macOS
- FreeBSD、OpenBSD、NetBSD
- Sun Solaris
- AIX
支持的Python版本为2.7、**3.6+**和PyPy <http://pypy.org/>
__。
资助
虽然psutil是免费软件并将永远如此,但该项目将从一些资金中受益匪浅。对我一个人来说,在时间上维持错误报告和维护工作已变得相当困难。如果您是一家大量使用psutil的公司,可以考虑通过GitHub Sponsors <https://github.com/sponsors/giampaolo>
__、Open Collective <https://opencollective.com/psutil>
__或PayPal <https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A9ZS7PKKRM3S8>
__成为赞助商,您的徽标将显示在这里和psutil的文档 <https://psutil.readthedocs.io>
__中。
赞助商
.. raw:: html
添加你的标志支持者
.. raw:: html
<div>
<a href="https://github.com/dbwiddis"><img height="40" width="40" title="Daniel Widdis" src="https://avatars1.githubusercontent.com/u/9291703?s=88&v=4" /></a>
<a href="https://github.com/aristocratos"><img height="40" width="40" title="aristocratos" src="https://avatars3.githubusercontent.com/u/59659483?s=96&v=4" /></a>
<a href="https://github.com/cybersecgeek"><img height="40" width="40" title="cybersecgeek" src="https://avatars.githubusercontent.com/u/12847926?v=4" /></a>
<a href="https://github.com/scoutapm-sponsorships"><img height="40" width="40" title="scoutapm-sponsorships" src="https://avatars.githubusercontent.com/u/71095532?v=4" /></a>
<a href="https://opencollective.com/chenyoo-hao"><img height="40" width="40" title="Chenyoo Hao" src="https://yellow-cdn.veclightyear.com/0a4dffa0/7a97362c-be26-4ef0-b941-0fba0132e5b9.png" /></a>
<a href="https://opencollective.com/alexey-vazhnov"><img height="40" width="40" title="Alexey Vazhnov" src="https://yellow-cdn.veclightyear.com/0a4dffa0/f435d1a6-e837-4850-bdb3-ace6c0da3837.png" /></a>
<a href="https://github.com/indeedeng"><img height="40" width="40" title="indeedeng" src="https://avatars.githubusercontent.com/u/2905043?s=200&v=4" /></a>
<a href="https://github.com/PySimpleGUI"><img height="40" width="40" title="PySimpleGUI" src="https://avatars.githubusercontent.com/u/46163555?v=4" /></a>
<a href="https://github.com/u93"><img height="40" width="40" title="Eugenio E Breijo" src="https://avatars.githubusercontent.com/u/16807302?v=4" /></a>
<a href="https://github.com/guilt"><img height="40" width="40" title="Karthik Kumar Viswanathan" src="https://avatars.githubusercontent.com/u/195178?v=4" /></a>
<a href="https://github.com/eallrich"><img height="40" width="40" title="Evan Allrich" src="https://avatars.githubusercontent.com/u/17393?v=4" /></a>
<a href="https://github.com/robusta-dev"><img height="40" width="40" title="Robusta" src="https://avatars.githubusercontent.com/u/82757710?s=200&v=4" /></a>
<a href="https://github.com/JeremyGrosser"><img height="40" width="40" title="JeremyGrosser" src="https://avatars.githubusercontent.com/u/2151?v=4" /></a>
<a href="https://github.com/getsentry"><img height="40" width="40" title="getsentry" src="https://avatars.githubusercontent.com/u/1396951?s=200&v=4" /></a>
<a href="https://github.com/c0m4r"><img height="40" width="40" title="c0m4r" src="https://avatars.githubusercontent.com/u/6292788?v=4" /></a>
</div>
<sup><a href="https://github.com/sponsors/giampaolo">添加你的头像</a></sup>
贡献
参见 贡献指南 <https://github.com/giampaolo/psutil/blob/master/CONTRIBUTING.md>
__。
使用示例
这几乎代表了整个psutil API。
CPU
.. code-block:: python
import psutil
psutil.cpu_times() scputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540, iowait=629.59, irq=0.0, softirq=19.42, steal=0.0, guest=0, guest_nice=0.0)
for x in range(3): ... psutil.cpu_percent(interval=1) ... 4.0 5.9 3.8
for x in range(3): ... psutil.cpu_percent(interval=1, percpu=True) ... [4.0, 6.9, 3.7, 9.2] [7.0, 8.5, 2.4, 2.1] [1.2, 9.0, 9.9, 7.2]
for x in range(3): ... psutil.cpu_times_percent(interval=1, percpu=False) ... scputimes(user=1.5, nice=0.0, system=0.5, idle=96.5, iowait=1.5, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0) scputimes(user=1.0, nice=0.0, system=0.0, idle=99.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0) scputimes(user=2.0, nice=0.0, system=0.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
psutil.cpu_count() 4 psutil.cpu_count(logical=False) 2
psutil.cpu_stats() scpustats(ctx_switches=20455687, interrupts=6598984, soft_interrupts=2134212, syscalls=0)
psutil.cpu_freq() scpufreq(current=931.42925, min=800.0, max=3500.0)
psutil.getloadavg() # 在Windows上也可用(模拟) (3.14, 3.89, 4.67)
内存
psutil.virtual_memory() svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304) psutil.swap_memory() sswap(total=2097147904, used=296128512, free=1801019392, percent=14.1, sin=304193536, sout=677842944)
磁盘
psutil.disk_partitions() [sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid'), sdiskpart(device='/dev/sda2', mountpoint='/home', fstype='ext', opts='rw')]
psutil.disk_usage('/') sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)
psutil.disk_io_counters(perdisk=False) sdiskio(read_count=719566, write_count=1082197, read_bytes=18626220032, write_bytes=24081764352, read_time=5023392, write_time=63199568, read_merged_count=619166, write_merged_count=812396, busy_time=4523412)
网络
psutil.net_io_counters(pernic=True) {'eth0': netio(bytes_sent=485291293, bytes_recv=6004858642, packets_sent=3251564, packets_recv=4787798, errin=0, errout=0, dropin=0, dropout=0), 'lo': netio(bytes_sent=2838627, bytes_recv=2838627, packets_sent=30567, packets_recv=30567, errin=0, errout=0, dropin=0, dropout=0)}
psutil.net_connections(kind='tcp') [sconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254), sconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987), ...]
psutil.net_if_addrs() {'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_LINK: 17>, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)], 'wlan0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_LINK: 17>, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}
psutil.net_if_stats() {'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536, flags='up,loopback,running'), 'wlan0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500, flags='up,broadcast,running,multicast')}
传感器
import psutil psutil.sensors_temperatures() {'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)], 'asus': [shwtemp(label='', current=47.0, high=None, critical=None)], 'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0), shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0)]}
psutil.sensors_fans() {'asus': [sfan(label='cpu_fan', current=3200)]}
psutil.sensors_battery() sbattery(percent=93, secsleft=16628, power_plugged=False)
其他系统信息
.. code-block:: python
>>> import psutil
>>> psutil.users()
[suser(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0, pid=1352),
suser(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0, pid=1788)]
>>>
>>> psutil.boot_time()
1365519115.0
>>>
进程管理
.. code-block:: python
import psutil psutil.pids() [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224, 268, 1215, 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355, 2637, 2774, 3932, 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 4263, 4282, 4306, 4311, 4312, 4313, 4314, 4337, 4339, 4357, 4358, 4363, 4383, 4395, 4408, 4433, 4443, 4445, 4446, 5167, 5234, 5235, 5252, 5318, 5424, 5644, 6987, 7054, 7055, 7071]
p = psutil.Process(7055) p psutil.Process(pid=7055, name='python3', status='running', started='09:04:44') p.pid 7055 p.name() 'python3' p.exe() '/usr/bin/python3' p.cwd() '/home/giampaolo' p.cmdline() ['/usr/bin/python3', 'main.py']
p.ppid() 7054 p.parent() psutil.Process(pid=4699, name='bash', status='sleeping', started='09:06:44') p.parents() [psutil.Process(pid=4699, name='bash', started='09:06:44'), psutil.Process(pid=4689, name='gnome-terminal-server', status='sleeping', started='0:06:44'), psutil.Process(pid=1, name='systemd', status='sleeping', started='05:56:55')] p.children(recursive=True) [psutil.Process(pid=29835, name='python3', status='sleeping', started='11:45:38'), psutil.Process(pid=29836, name='python3', status='waking', started='11:43:39')]
p.status() 'running' p.create_time() 1267551141.5019531 p.terminal() '/dev/pts/0'
p.username() 'giampaolo' p.uids() puids(real=1000, effective=1000, saved=1000) p.gids() pgids(real=1000, effective=1000, saved=1000)
p.cpu_times() pcputimes(user=1.02, system=0.31, children_user=0.32, children_system=0.1, iowait=0.0) p.cpu_percent(interval=1.0) 12.1 p.cpu_affinity() [0, 1, 2, 3] p.cpu_affinity([0, 1]) # 设置 p.cpu_num() 1
p.memory_info() pmem(rss=10915840, vms=67608576, shared=3313664, text=2310144, lib=0, data=7262208, dirty=0) p.memory_full_info() # "真实"USS内存使用(仅限Linux、macOS、Windows) pfullmem(rss=10199040, vms=52133888, shared=3887104, text=2867200, lib=0, data=5967872, dirty=0, uss=6545408, pss=6872064, swap=0) p.memory_percent() 0.7823 p.memory_maps() [pmmap_grouped(path='/lib/x8664-linux-gnu/libutil-2.15.so', rss=32768, size=2125824, pss=32768, shared_clean=0, shared_dirty=0, private_clean=20480, private_dirty=12288, referenced=32768, anonymous=12288, swap=0), pmmap_grouped(path='/lib/x8664-linux-gnu/libc-2.15.so', rss=3821568, size=3842048, pss=3821568, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=3821568, referenced=3575808, anonymous=3821568, swap=0), pmmap_grouped(path='[heap]', rss=32768, size=139264, pss=32768, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=32768, referenced=32768, anonymous=32768, swap=0), pmmap_grouped(path='[stack]', rss=2465792, size=2494464, pss=2465792, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=2465792, referenced=2277376, anonymous=2465792, swap=0), ...]
p.io_counters() pio(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632, read_chars=456232, write_chars=517543)
p.open_files() [popenfile(path='/home/giampaolo/monit.py', fd=3, position=0, mode='r', flags=32768), popenfile(path='/var/log/monit.log', fd=4, position=235542, mode='a', flags=33793)]
p.net_connections(kind='tcp') [pconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'), pconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING')]
p.threads() [pthread(id=5234, user_time=22.5, system_time=9.2891), pthread(id=5237, user_time=0.0707, system_time=1.1)]
p.num_threads() 4 p.num_fds() 8 p.num_ctx_switches() pctxsw(voluntary=78, involuntary=19)
p.nice() 0 p.nice(10) # 设置
p.ionice(psutil.IOPRIO_CLASS_IDLE) # IO优先级(仅适用于Windows和Linux) p.ionice() pionice(ioclass=<IOPriority.IOPRIO_CLASS_IDLE: 3>, value=0)
p.rlimit(psutil.RLIMIT_NOFILE, (5, 5)) # 设置资源限制(仅适用于Linux) p.rlimit(psutil.RLIMIT_NOFILE) (5, 5)
p.environ() {'LC_PAPER': 'it_IT.UTF-8', 'SHELL': '/bin/bash', 'GREP_OPTIONS': '--color=auto', 'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg', ...}
p.as_dict() {'status': 'running', 'num_ctx_switches': pctxsw(voluntary=63, involuntary=1), 'pid': 5457, ...} p.is_running() True p.suspend() p.resume()
p.terminate() p.kill() p.wait(timeout=3) <Exitcode.EX_OK: 0>
psutil.test() 用户 PID %CPU %MEM VSZ RSS 终端 开始时间 运行时间 命令 root 1 0.0 0.0 24584 2240 6月17日 00:00 init root 2 0.0 0.0 0 0 6月17日 00:00 kthreadd ... giampaolo 31475 0.0 0.0 20760 3024 /dev/pts/0 6月19日 00:00 python2.4 giampaolo 31721 0.0 2.2 773060 181896 00:04 10:30 chrome root 31763 0.0 0.0 0 0 00:05 00:00 kworker/0:1
进一步处理API
.. code-block:: python
>>> import psutil
>>> for proc in psutil.process_iter(['pid', 'name']):
... print(proc.info)
...
{'pid': 1, 'name': 'systemd'}
{'pid': 2, 'name': 'kthreadd'}
{'pid': 3, 'name': 'ksoftirqd/0'}
...
>>>
>>> psutil.pid_exists(3)
True
>>>
>>> def on_terminate(proc):
... print("进程 {} 已终止".format(proc))
...
>>> # 等待多个进程终止
>>> gone, alive = psutil.wait_procs(procs_list, timeout=3, callback=on_terminate)
>>>
Windows服务
.. code-block:: python
>>> list(psutil.win_service_iter())
[<WindowsService(name='AeLookupSvc', display_name='应用程序体验') at 38850096>,
<WindowsService(name='ALG', display_name='应用程序层网关服务') at 38850128>,
<WindowsService(name='APNMCP', display_name='Ask更新服务') at 38850160>,
<WindowsService(name='AppIDSvc', display_name='应用程序标识') at 38850192>,
...]
>>> s = psutil.win_service_get('alg')
>>> s.as_dict()
{'binpath': 'C:\\Windows\\System32\\alg.exe',
'description': '为Internet连接共享提供第三方协议插件支持',
'display_name': '应用程序层网关服务',
'name': 'alg',
'pid': None,
'start_type': '手动',
'status': '已停止',
'username': 'NT AUTHORITY\\LocalService'}
使用psutil的项目
以下是我认为特别有趣的一些项目:
- https://github.com/google/grr
- https://github.com/facebook/osquery/
- https://github.com/nicolargo/glances
- https://github.com/aristocratos/bpytop
- https://github.com/Jahaja/psdash
- https://github.com/ajenti/ajenti
- https://github.com/home-assistant/home-assistant/