​Python 常用库之 psutil 使用指南

(点击上方公众号,可快速关注)


作者:古明地盆


来源:www.cnblogs.com/traditional/p/12580638.html


Python 有一个第三方模块:psutil,专门用来获取操作系统以及硬件相关的信息,比如:CPU、磁盘、网络、内存等等。


首先我们要安装,直接 pip install psutil 即可,安装之后来看看它的用法。


CPU 相关


获取 CPU 的逻辑数量


import psutil

print(psutil.cpu_count())  # 12


获取 CPU 的物理核心数量


import psutil

print(psutil.cpu_count(logical=False))  # 6


结果为 6,说明是 6 核超线程;如果 CPU 的物理核心数 和 逻辑数相等,也为 12,则说明是 12 核非超线程。


统计 CPU 的用户/系统/空闲时间


import psutil

print(psutil.cpu_times()) 
# scputimes(user=65531.796875, system=42440.76562500023, idle=1783904.3593749998, interrupt=5676.375, dpc=1846.609375)

# psutil.cpu_times_percent() 功能与之类似, 只不过返回的比例


返回的是一个 namedtuple,后面凡是结构长的和这里类似的,都是 namedtuple。


查看 CPU 的使用率


import psutil

for x in range(3):
    # interval:表示每隔0.5s刷新一次
    # percpu:表示查看所有的cpu使用率
    print(psutil.cpu_percent(interval=0.5, percpu=True))
"""
[6.1, 6.2, 9.4, 3.1, 0.0, 0.0, 0.0, 6.2, 3.1, 3.1, 3.1, 0.0]
[0.0, 0.0, 6.1, 0.0, 6.1, 3.0, 0.0, 3.0, 3.0, 3.0, 0.0, 9.1]
[0.0, 0.0, 6.2, 3.1, 3.1, 0.0, 3.1, 3.1, 3.1, 3.1, 0.0, 0.0]
"""
# 我这里cpu的逻辑数量是12, 所以每个列表里面有12个元素


查看 CPU 的统计信息,包括上下文切换、中断、软中断,以及系统调用次数等等


import psutil

print(psutil.cpu_stats())
# scpustats(ctx_switches=2912990332, interrupts=4290503758, soft_interrupts=0, syscalls=2698751096)


查看 CPU 的频率


import psutil

print(psutil.cpu_freq())  # scpufreq(current=2208.0, min=0.0, max=2208.0)


内存相关


查看内存使用情况


import psutil

print(psutil.virtual_memory())  
# svmem(total=17029259264, available=8437215232, percent=50.5, used=8592044032, free=8437215232)


  • total: 总内存

  • available: 可用内存

  • percent: 内存使用率

  • used: 已使用的内存


  • 查看交换内存信息


    import psutil

    print(psutil.swap_memory())
    # sswap(total=19579396096, used=15708250112, free=3871145984, percent=80.2, sin=0, sout=0)


    关于物理内存和交换内存之间的关系。


    物理内存:就是实际的内存条提供的临时数据存储空间,在 Windows 上右键点击计算机,再点击属性时,上面显示的安装内存(RAM)就是电脑的物理内存。这些内存是实际存在的,在你不给机器增加内存条的时候是不会改变的。


    交换内存:交换内存是专门用来临时存储数据的,通常在页面调度和交换进程数据时使用。


    相当于在进行内存整理的时候,会先把部分数据放在硬盘的某个地方,类似我们整理衣柜,衣服一多直接整理会很麻烦,因此会先把部分衣服放在其他地方,等衣柜里的衣服整理完了再把放在其它地方的衣服拿回来。


    这个其他地方放在计算机中则代表硬盘的某个地方,也就是我们所说的交换区。


    通常当使用交换内存时,是因为物理内存不足,正所谓衣柜,如果足够大的话就没必要拿出部分衣服放在其它地方, 直接在衣柜里就能解决了。


    虚拟内存:首先,如果想要操作文件,可执行程序等等,那么首先要把它们从磁盘上读取到内存中,因此 CPU 除了自己的那一部分小小的空间外,要想操作数据,只能操作内存里的数据。


    但是当内存不够了,那么便会在硬盘上开辟一份虚拟内存,将物理内存里的部分数据放在虚拟内存当中。


    硬盘的空间很大,即使普通电脑安装的固态硬盘也有一百个 G,因此可以拿出一部分充当虚拟内存。


    不过虚拟内存虽说是内存,但毕竟在硬盘上,速度绝对和 CPU 直接从物理内存里读取数据的速度相差甚远。


    这也是为什么那些大型网站将经常被访问的一些数据放在 Redis 缓存里,而不是放在硬盘或者数据库上。


    磁盘相关


    查看磁盘分区、磁盘使用率和磁盘 IO 信息


    from pprint import pprint
    import psutil

    pprint(psutil.disk_partitions())
    """
    [sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'),
     sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'),
     sdiskpart(device='E:\\', mountpoint='E:\\', fstype='NTFS', opts='rw,fixed')]
    """
    # 可以看到一共有三个盘符,fstype表示文件系统格式是NTFS,opts中的rw表示可读写
    # 里面有一个参数 all, 默认为 False, 如果指定为 True, 那么返回的内容还会包含 /proc 等特殊文件系统的挂载信息
    # 由于我这里是 Windows, 所以两者没区别


    查看某个磁盘使用情况


    import psutil

    print(psutil.disk_usage("C:\\"))
    # sdiskusage(total=267117391872, used=88213196800, free=178904195072, percent=33.0)


    查看磁盘 IO 统计信息


    from pprint import pprint
    import psutil

    pprint(psutil.disk_io_counters())
    # sdiskio(read_count=1270037, write_count=2146886, read_bytes=34637616128, write_bytes=53505994240, read_time=551, write_time=1258)


  • read_count: 读次数

  • write_count: 写次数

  • read_bytes: 读的字节数

  • write_bytes: 写的字节数

  • read_time: 读时间

  • write_time: 写时间


  • 默认返回的是所有磁盘加起来的统计信息,我们可以指定 perdisk=True,则分别列出每一个磁盘的统计信息。


    from pprint import pprint
    import psutil

    pprint(psutil.disk_io_counters(perdisk=True))
    """
    {'PhysicalDrive0': sdiskio(read_count=1262459, write_count=2149207, read_bytes=34598280704, write_bytes=53708976128, read_time=532, write_time=1261),
     'PhysicalDrive1': sdiskio(read_count=7702, write_count=98, read_bytes=41695232, write_bytes=4730880, read_time=19, write_time=0)}
    """


    网络相关


    查看网卡的网络 IO 统计信息


    from pprint import pprint
    import psutil

    pprint(psutil.net_io_counters())
    """
    snetio(bytes_sent=536008958, bytes_recv=8676204996, packets_sent=2725499, packets_recv=7225179, errin=0, errout=9, dropin=0, dropout=0)
    """
    # bytes_sent: 发送的字节数
    # bytes_recv: 接收的字节数
    # packets_sent: 发送的包数据量
    # packets_recv: 接收的包数据量
    # errin: 接收包时, 出错的次数
    # errout: 发送包时, 出错的次数
    # dropin: 接收包时, 丢弃的次数
    # dropout: 发送包时, 丢弃的次数


    # 里面还有一个 pernic 参数, 如果为 True, 则列出所有网卡的信息
    pprint(psutil.net_io_counters(pernic=True))
    """
    {'Loopback Pseudo-Interface 1': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),
     'WLAN': snetio(bytes_sent=534497477, bytes_recv=8678905297, packets_sent=2706204, packets_recv=7244187, errin=0, errout=0, dropin=0, dropout=0),
     '以太网': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),
     '以太网 2': snetio(bytes_sent=3612804, bytes_recv=7955853, packets_sent=32818, packets_recv=26442, errin=0, errout=9, dropin=0, dropout=0),
     '本地连接* 2': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),
     '本地连接* 3': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),
     '蓝牙网络连接': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0)}
    """


    查看网络接口信息


    from pprint import pprint
    import psutil

    # 以字典的形式返回网卡的配置信息, 包括 IP 地址、Mac地址、子网掩码、广播地址等等
    pprint(psutil.net_if_addrs())
    """
    {'Loopback Pseudo-Interface 1': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None),
                                     snicaddr(family=<AddressFamily.AF_INET6: 23>, address='::1', netmask=None, broadcast=None, ptp=None)],
     'WLAN': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='04-EA-56-8C-36-24', netmask=None, broadcast=None, ptp=None),
              snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.8.115', netmask='255.255.255.0', broadcast=None, ptp=None),
              snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fd94:e9ee:f230:6e00:55c9:8d1e:f23d:3acc', netmask=None, broadcast=None, ptp=None),
              snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fd94:e9ee:f230:6e00:dc07:1987:2395:d871', netmask=None, broadcast=None, ptp=None),
              snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::55c9:8d1e:f23d:3acc', netmask=None, broadcast=None, ptp=None)],
     '以太网': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='9C-7B-EF-15-FC-2F', netmask=None, broadcast=None, ptp=None),
             snicaddr(family=<AddressFamily.AF_INET: 2>, address='10.254.61.6', netmask='255.255.255.0', broadcast=None, ptp=None),
             snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.54.71', netmask='255.255.0.0', broadcast=None, ptp=None),
             snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::4826:a6a6:b5f4:3647', netmask=None, broadcast=None, ptp=None)],
     '以太网 2': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='00-FF-B3-BA-07-AE', netmask=None, broadcast=None, ptp=None),
               snicaddr(family=<AddressFamily.AF_INET: 2>, address='2.0.1.32', netmask='255.255.255.0', broadcast=None, ptp=None),
               snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::cc21:26c6:9327:1355', netmask=None, broadcast=None, ptp=None)],
     '本地连接* 2': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='04-EA-56-8C-36-25', netmask=None, broadcast=None, ptp=None),
                 snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.45.234', netmask='255.255.0.0', broadcast=None, ptp=None),
                 snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::d958:b3fe:ef3d:2dea', netmask=None, broadcast=None, ptp=None)],
     '本地连接* 3': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='06-EA-56-8C-36-24', netmask=None, broadcast=None, ptp=None),
                 snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.41.166', netmask='255.255.0.0', broadcast=None, ptp=None),
                 snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::6474:c583:1626:29a6', netmask=None, broadcast=None, ptp=None)],
     '蓝牙网络连接': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='04-EA-56-8C-36-28', netmask=None, broadcast=None, ptp=None),
                snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.135.205', netmask='255.255.0.0', broadcast=None, ptp=None),
                snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::5cbd:8913:7499:87cd', netmask=None, broadcast=None, ptp=None)]}

    """

    # 返回网卡的详细信息, 包括是否启动、通信类型、传输速度、mtu
    pprint(psutil.net_if_stats())
    """
    {'Loopback Pseudo-Interface 1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1073, mtu=1500),
     'WLAN': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=866, mtu=1500),
     '以太网': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
     '以太网 2': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=10, mtu=1400),
     '本地连接* 2': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
     '本地连接* 3': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
     '蓝牙网络连接': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=3, mtu=1500)}
    """


    查看当前机器的网络连接


    from pprint import pprint
    import psutil

    # 以列表的形式返回每个网络连接的详细信息
    # 里面接受一个参数, 默认是 "inet", 当然我们也可以指定为其它, 比如 "tcp"
    pprint(psutil.net_connections())
    """
    [sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=1024), raddr=(), status='LISTEN', pid=940),
     sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=5432), raddr=(), status='LISTEN', pid=7620),
     sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=10637), raddr=addr(ip='127.0.0.1', port=10638), status='ESTABLISHED', pid=10152),
     sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=10613), raddr=addr(ip='127.0.0.1', port=10612), status='ESTABLISHED', pid=10152),
     sconn(fd=-1, family=<AddressFamily.AF_INET6: 23>, type=<SocketKind.SOCK_DGRAM: 2>, laddr=addr(ip='::', port=5353), raddr=(), status='NONE', pid=8820),
     sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=54541), raddr=(), status='LISTEN', pid=2908),
     sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, 
     ....
     ....
     ....
    ]
    """

    # 是不是很方便呢? 在 Linux 中有两个命令可以做到这一点, netstat 和 ss
    # $ netstat -nat
    # $ ss -nat

    # 但是在生产环境中, 线上服务器很多都是最小化安装, 并不能保证每台机器上都有 ss 或者 netstat 命令, 而这个时候 psutil 就派上用场了


    查看当前登录的用户信息


    from pprint import pprint
    import psutil

    pprint(psutil.users())  
    # [suser(name='satori', terminal=None, host='0.0.0.0', started=1609841661.0, pid=None)]


  • name: 用户名

  • terminal: 终端

  • host: 主机地址

  • started: 登录时间

  • pid: 进程id


  • 查看系统的启动时间


    from pprint import pprint
    import psutil
    import datetime

    pprint(psutil.boot_time())  # 1585282271.0
    print(datetime.datetime.fromtimestamp(psutil.boot_time()))  # 2020-03-27 12:11:11


    进程管理


    psutil 还提供了很多和进程管理相关的功能函数,非常的丰富,我们来看一下。


    查看当前存在的所有进程的 pid


    from pprint import pprint
    import psutil

    pprint(psutil.pids())
    """
    [0,
     4,
     144,
     512,
     536,
     632,
     640,
     664,
     696,
     768,
     776,
     ...
     ...
     ...
    ]
    """


    查看某个进程是否存在


    from pprint import pprint
    import psutil

    pprint(psutil.pid_exists(22333))  # False
    pprint(psutil.pid_exists(0))  # True


    返回所有进程(Process)对象组成的迭代器


    from pprint import pprint
    import psutil

    pprint(psutil.process_iter())  # <generator object process_iter at 0x000001F12032C9E0>


    根据 pid 获取一个进程对应的 Process 对象


    from pprint import pprint
    import psutil

    pprint(psutil.Process(pid=0))  # psutil.Process(pid=0, name='System Idle Process', started='2020-2-27 09:07:47')


    获取进程相关的具体信息


    我们说根据 pid 可以获取一个进程对应的 Process 对象,而这个对象里面包含了该进程的全部信息。


     from pprint import pprint
    import psutil

    p = psutil.Process(pid=16948)

    # 进程名称
    print(p.name()) # WeChat.exe

    # 进程的exe路径
    print(p.exe()) # D:\WeChat\WeChat.exe

    # 进程的工作目录
    print(p.cwd()) # D:\WeChat

    # 进程启动的命令行
    print(p.cmdline()) # ['D:\\WeChat\\WeChat.exe']

    # 当前进程id
    print(p.pid) # 16948

    # 父进程id
    print(p.ppid()) # 11700

    # 父进程
    print(p.parent()) # psutil.Process(pid=11700, name='explorer.exe', started='09:19:06')

    # 子进程列表
    pprint(p.children())
    """
    [psutil.Process(pid=17452, name='WeChatWeb.exe', started='09:21:02'), 
     psutil.Process(pid=16216, name='WeChatApp.exe', started='09:21:40'), 
     psutil.Process(pid=13452, name='SogouCloud.exe', started='09:22:14')]
    """

    # 进程状态
    print(p.status()) # running

    # 进程用户名
    print(p.username()) # LAPTOP-264ORES3\satori

    # 进程创建时间,返回时间戳
    print(p.create_time()) # 1561775539.0

    # 进程终端
    # 在windows上无法使用
    try:
        print(p.terminal())
    except Exception as e:
        print(e) # 'Process' object has no attribute 'terminal'

    # 进程使用的cpu时间
    print(p.cpu_times())  # pcputimes(user=133.3125, system=188.203125, children_user=0.0, children_system=0.0)

    # 进程所使用的的内存
    print(p.memory_info())
    """
    pmem(rss=128634880, vms=117067776, num_page_faults=12193918, 
         peak_wset=263921664, wset=128634880, peak_paged_pool=1398584, 
         paged_pool=1329936, peak_nonpaged_pool=313896, nonpaged_pool=152192, 
         pagefile=117067776, peak_pagefile=201670656, private=117067776)
    """

    # 进程打开的文件
    pprint(p.open_files())
    """
    [popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Media.db-wal', fd=-1),
     popenfile(path='C:\\Users\\satori\\AppData\\Roaming\\Tencent\\WeChat\\All Users\\CefResources\\2581\\qb_200_percent.pak', fd=-1),
     popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Multi\\MSG0.db-shm', fd=-1),
     popenfile(path='C:\\Program Files\\WindowsApps\\Microsoft.LanguageExperiencePackzh-CN_18362.28.87.0_neutral__8wekyb3d8bbwe\\Windows\\System32\\zh-CN\\dui70.dll.mui', fd=-1),
     popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Multi\\MediaMSG2.db-shm', fd=-1),
     popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Emotion.db-wal', fd=-1),
     popenfile(path='C:\\Windows\\Fonts\\msyh.ttc', fd=-1),
     ......
     ......
     ......
     ]
    """

    # 进程相关的网络连接
    pprint(p.connections())
    """
    [pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.8.115', port=5162), raddr=addr(ip='183.3.234.107', port=443), status='ESTABLISHED'),
     pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.8.115', port=13856), raddr=addr(ip='61.151.168.204', port=80), status='CLOSE_WAIT'),
     pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=8680), raddr=(), status='LISTEN')]
    """

    # 进程内的线程数量,这个进程开启了多少个线程
    print(p.num_threads())  # 66

    # 这个进程内的所有线程信息
    pprint(p.threads())
    """
    [pthread(id=13340, user_time=113.328125, system_time=179.015625),
     pthread(id=17120, user_time=0.0, system_time=0.0625),
     pthread(id=7216, user_time=0.15625, system_time=0.515625),
     pthread(id=13360, user_time=0.703125, system_time=0.21875),
     pthread(id=10684, user_time=0.015625, system_time=0.078125),
     pthread(id=13552, user_time=2.9375, system_time=0.171875),
     pthread(id=12620, user_time=0.265625, system_time=0.296875),
     pthread(id=14492, user_time=0.015625, system_time=0.03125),
     pthread(id=14568, user_time=0.0, system_time=0.046875),
     pthread(id=17112, user_time=0.015625, system_time=0.0625),
     pthread(id=9344, user_time=0.0, system_time=0.015625),
     pthread(id=13544, user_time=0.0, system_time=0.0),
     pthread(id=10028, user_time=0.078125, system_time=0.125),
     pthread(id=4920, user_time=0.015625, system_time=0.0625),
     pthread(id=5744, user_time=0.0, system_time=0.015625),
     pthread(id=7044, user_time=0.0, system_time=0.0),
     pthread(id=14064, user_time=0.0, system_time=0.0),
     pthread(id=11916, user_time=0.0, system_time=0.0),
     pthread(id=1316, user_time=0.0, system_time=0.0),
     pthread(id=18100, user_time=0.0, system_time=0.0),
     pthread(id=2992, user_time=0.0, system_time=0.0),
     pthread(id=8956, user_time=0.0, system_time=0.0),
     pthread(id=8588, user_time=0.03125, system_time=0.03125),
     pthread(id=3944, user_time=0.0, system_time=0.03125),
     pthread(id=15828, user_time=0.0, system_time=0.015625),
     pthread(id=7348, user_time=0.0, system_time=0.03125),
     pthread(id=3400, user_time=0.0, system_time=0.015625),
     pthread(id=8628, user_time=0.0, system_time=0.0),
     pthread(id=2400, user_time=0.0, system_time=0.0),
     pthread(id=9432, user_time=1.28125, system_time=0.171875),
     pthread(id=11544, user_time=0.0, system_time=0.015625),
     pthread(id=12348, user_time=2.96875, system_time=3.78125),
     pthread(id=3444, user_time=0.0, system_time=0.0),
     pthread(id=17476, user_time=0.0, system_time=0.0),
     pthread(id=15856, user_time=0.0, system_time=0.015625),
     pthread(id=12248, user_time=0.0, system_time=0.0),
     pthread(id=17280, user_time=0.0, system_time=0.0),
     ......
     ......
     ......
     ]
    """

    # 进程的环境变量
    pprint(p.environ())
    """
    {'ALLUSERSPROFILE': 'C:\\ProgramData',
     'APPDATA': 'C:\\Users\\satori\\AppData\\Roaming',
     'COMMONPROGRAMFILES': 'C:\\Program Files (x86)\\Common Files',
     'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files',
     'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files',
     'COMPUTERNAME': 'LAPTOP-264ORES3',
     'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe',
     'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData',
     'GOPATH': 'C:\\Users\\satori\\go',
     'HOMEDRIVE': 'C:',
     'HOMEPATH': '\\Users\\satori',
     'LOCALAPPDATA': 'C:\\Users\\satori\\AppData\\Local',
     'LOGONSERVER': '\\\\LAPTOP-264ORES3',
     'NUMBER_OF_PROCESSORS': '12',
     'ONEDRIVE': 'C:\\Users\\satori\\OneDrive',
     'ONEDRIVECONSUMER': 'C:\\Users\\satori\\OneDrive',
     'ONLINESERVICES': 'Online Services',
     'OS': 'Windows_NT',
     'PATH': 'C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine '
             'Components\\iCLS\\;C:\\Program Files\\Intel\\Intel(R) Management '
             'Engine '
             'Components\\iCLS\\;C:\\windows\\system32;C:\\windows;C:\\windows\\System32\\Wbem;C:\\windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\windows\\System32\\OpenSSH\\;C:\\Program '
             'Files (x86)\\Intel\\Intel(R) Management Engine '
             'Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine '
             'Components\\DAL;C:\\Program Files (x86)\\NVIDIA '
             'Corporation\\PhysX\\Common;C:\\Program '
             'Files\\Intel\\WiFi\\bin\\;C:\\Program Files\\Common '
             'Files\\Intel\\WirelessCommon\\;C:\\python37;c:\\python37\\Scripts;C:\\Program '
             'Files\\Git\\cmd;E:\\instantclient_10_2;C:\\Program '
             'Files\\Redis\\;D:\\ffmpeg\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Go\\bin;C:\\MingW\\bin;C:\\Users\\satori\\.cargo\\bin;C:\\python37\\Scripts\\;C:\\python37\\;C:\\python38\\Scripts\\;C:\\python38\\;C:\\Users\\satori\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\satori\\go\\bin',
     'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
     'PLATFORMCODE': 'AN',
     'PROCESSOR_ARCHITECTURE': 'x86',
     'PROCESSOR_ARCHITEW6432': 'AMD64',
     'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 158 Stepping 10, GenuineIntel',
     'PROCESSOR_LEVEL': '6',
     'PROCESSOR_REVISION': '9e0a',
     'PROGRAMDATA': 'C:\\ProgramData',
     'PROGRAMFILES': 'C:\\Program Files (x86)',
     'PROGRAMFILES(X86)': 'C:\\Program Files (x86)',
     'PROGRAMW6432': 'C:\\Program Files',
     'PSMODULEPATH': 'C:\\Program '
                     'Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules',
     'PUBLIC': 'C:\\Users\\Public',
     'REGIONCODE': 'APJ',
     'SESSIONNAME': 'Console',
     'SYSTEMDRIVE': 'C:',
     'SYSTEMROOT': 'C:\\WINDOWS',
     'TBS_CONTENT_MAIN_RUNNER_INITIALIZED': '1',
     'TEMP': 'C:\\Users\\satori\\AppData\\Local\\Temp',
     'TMP': 'C:\\Users\\satori\\AppData\\Local\\Temp',
     'USERDOMAIN': 'LAPTOP-264ORES3',
     'USERDOMAIN_ROAMINGPROFILE': 'LAPTOP-264ORES3',
     'USERNAME': 'satori',
     'USERPROFILE': 'C:\\Users\\satori',
     'VS140COMNTOOLS': 'C:\\Program Files (x86)\\Microsoft Visual Studio '
                       '14.0\\Common7\\Tools\\',
     'WINDIR': 'C:\\WINDOWS',
     'WXDRIVE_START_ARGS': '--wxdrive-setting=0 --disable-gpu '
                           '--disable-software-rasterizer '
                           '--enable-features=NetworkServiceInProcess'}
    """

    # 结束进程, 返回 None, 执行之后微信就会被强制关闭, 当然这里就不试了
    # print(p.terminal())  # None


    我们还可以调用 psutil.test 来模拟 ps 命令。


    import psutil

    psutil.test()
    """
    USER         PID  %MEM     VSZ     RSS  NICE STATUS  START   TIME  CMDLINE
    SYSTEM         0   0.0   60.0K    8.0K        runni  Dec30  00:39  System Idle P
    SYSTEM         4   0.0  236.0K    1.4M        runni  Dec30  14:32  System
                 144   0.2    8.1M   32.2M        runni  Dec30  00:03  Registry
                 512   0.0    1.1M  304.0K        runni  Dec30  00:00  smss.exe
                 536   0.0  912.0K    1.0M        runni  Dec30  00:00  svchost.exe
                 632   0.1   13.0M   15.0M        runni  Dec30  00:29  svchost.exe
                 640   0.0    2.1M    1.3M        runni  Dec30  00:00  fontdrvhost.e
    satori       664   0.1   26.1M   17.1M    32  runni  09:19  00:02  C:\WINDOWS\Sy
                 696   0.0    6.7M    3.8M        runni  Dec30  00:04  WUDFHost.exe
                 768   0.0    1.9M    1.9M        runni  Dec30  00:26  csrss.exe
    ......................
    ......................
    ......................
    ......................
    ......................
    """


    它是怎么做的呢?还记得我们之前说的 process_iter 吗?


    会返回所有进程的 Process 对象,直接依次输出里面的信息即可。


    同理,我们也可以通过 process_iter 找到某一个进程对应的进程 id。


    import psutil

    for prcs in psutil.process_iter():
        if prcs.name().lower() == "wechat.exe":
            print(prcs.pid)
    """
    16948
    """

    # 有了这个骚操作之后,我们便可以通过进程 id 找到对应的进程
    # 然后修改里面的数据


    收外国男骗中国妹子的炮?天朝竟有这样一帮「女权组织」 2018-03-19 INSIGHT视界 From 酷玩实验室 微信号:coollabs 其实我读书的时候 也曾经想过做一个女权主义者 但是后来发生了一些事情 让我选择了放弃 简单来说是这么一个事情:我发现 女权对于一些中国人来说是信仰 但是对另一些中国人来说是生意 所谓的“伪女权”“女权癌” 大概就是这么回事 尽管早就有这样的思想准备 但让我没想到的是 这两天,知乎上曝光了一件大事 还是让我三观震碎 我没想到,这些“伪女权” 竟然已经形成了黑色产业链 让人细思恐极—— 国内竟然有一群人 打着“女权主义”的名号 从事着组织卖淫的事情 在中国女生不知情的情况下 把她们卖给外国男人!事情是这样的:根据知乎用户伊利丹·怒风的爆料 他在知乎和一个伪女权主义者 吵了起来 一开始,他可能以为这只是一个 脑子比较轴的伪女权主义者 所以两人就吵了一通 本来,他以为就是撕个逼而已 没想到的是 这个伪女权主义者 可不是什么好惹的主 这个自称为“玛丽女王”的人 竟然在半个月中 持续不断地骚扰他 而最夸张的是 玛丽女王声称 自己有能力 让伊利丹的QQ号 在5天之内被封掉 到这里为止 伊利丹一直以为 他不过是碰到了一个杠精 但是万万没想到 5天之后 他的QQ号竟然真的被永久封禁了!说真的,这就有点吓人了 这个不起眼的玛丽女王 竟然还能操控别人的QQ账号被封?难不成,她真的背后有人?伊利丹这才意识到 自己好像惹到了一个组织 他去扒了扒这个玛丽女王的QQ空间 这才发现 自己简直捅出一个马蜂窝:这个人平时干的 竟然是把中国女生 卖给外国男人的皮肉生意!真的,我本来以为 我是一个见过不少套路的人 但没想到 这一套操作 真的是惊为天人 简单来说是这样的 首先,玛丽女王自称是“女权主义者” 但是实际上她的言论 宣传的却是 中国男人配不上中国女人 她甚至恶意辱骂中国男人 恨不得中国男人全部死光 连自己的爸爸都不放过 但是,这么做对她有什么好处呢?很简单 骂完中国男人以后 接下来她就说—— 既然中国男人这么差劲 那就找外国男人吧!于是,她就经常发布外国男人的介绍 看起来是一个热心的媒婆 还在各种QQ和微信群里 散播此类信息 但是看到这里 我们不难发现有点问题 看看其中这些不堪入目的措辞 这并不是普通的介绍男友啊!这简直是在拉皮条啊!果然,伊利丹发现 玛丽女王真的在 拉皮条的过程中 收外国男人的钱!下面是聊天记录实锤:而且,请注意—— 在这个过程中 她会收外国男人的钱 但是钱不给中国女生 却落到了她自己的腰包 于是一个诡异的情况出现了:中国妹子 并不知道收钱这回事 还以为是正常交友 而外国男人 却都交了钱 很可能认为自己是在买春!额,也就是说 在中国女孩不知情的情况下 她们被“卖”给了外国男人 而好处费 却全都进了玛丽女王的腰包... 我真的是没见过这种操作 这说轻了是骗炮 说重了,已经可以算是卖淫了吧?我想请熟悉刑法的朋友们看看 这个玛丽女王 至少应该算是个 介绍组织卖淫罪吧?而且,从伊利丹曝光的资料看来 这个组织规模不小 玛丽女王甚至把外国男生的信息 建了一个完整的表格 有详细的个人资料、照片 可以说 是一条非常完整的产业链 那如果按照这样操作 外国男人都是来嫖的 中国女生却不知道 还以为是要跟他们谈恋爱 那双方难道不会穿帮吗?恩,在这方面 玛丽女王早有对策 根据知乎一位 从事过这个产业的匿名用户提供的信息 针对这种情况 玛丽女王们 还会手把手地教外国男人 怎么快速摆脱女生的纠缠 怎么调教中国女生 怎么让女生觉得自己很可爱 可以说 各种套路一应俱全 甚至还可以开发票!看到这里 她们背后的产业就非常清楚了 这个玛丽女王 她根本就不是什么女权主义者 而是打着女权主义的口号 贩卖中国女生的人贩子 一方面 她们通过辱骂中国男人 吸引对外国男人感兴趣的中国女生 另一方面 她们向外国男人收钱 然后把中国女生卖给他们!图片来源:知乎@渭水徐工 而可怜的中国妹子们 还以为自己是在 追求男女平权 其实,不过是沦为了 这些老鸨的赚钱工具 伊利丹把这整个事情 写出来以后 在知乎、微博引起了巨大的关注 关于其中提到的 伊利丹的QQ被永久封禁的问题 腾讯经过核查 目前也有了结果:经调查,是玛丽女王利用伪造证据 恶意举报了伊利丹的QQ号 目前,腾讯已经将伊利丹的QQ解封 同时封禁了玛丽女王等人的 两个QQ账号 警方也就此事立案侦查了 相信很快就会有结果 这个事情算是告一段落了 但是在我看来 却有一件事让我无法释怀:为什么“女权主义”竟然会和 辱骂中国男性等同起来?为什么“和外国男人交友” 竟然还能演变成 一个免费的陪睡组织?我想,这个玛丽女王 也许只是一个 发现了恶性赚钱模式的生意人 但是在这背后隐藏的 其实是一个很深的问题:为什么有不少中国女人 越来越看不上中国男人 甚至觉得嫁给外国男人 是一种时尚?这里面的原因可能非常复杂 我这里先提供一个思路 供大家讨论:我发现 现在中国很多大型的女权组织 背后都有着西方势力的影子 她们打着女权的名号 为自己谋取暴利 为西方国家从事破坏活动 而那些真正为女性平权而奔走的人 却得不到应有的帮助 我之所以这样说 并不是信口开河 而是有充足的证据 有一个非常有名的民间女权组织 叫做“女权之声” 它一再声称 自己只是一个自发的民间组织 致力于促进男女平等的 它所有的微博账号、微信账号 全部都是由一个 叫做妇女传媒监测网络的创办的 而这个妇女传媒监测网络 有这么多媒体产品 那它的钱都是哪里来的呢?从她们介绍的合作组织里 我们可以清楚地找到 她们的资助者—— 竟然有西方的福特基金会 有人也许会问 收了西方的钱怎么了?中国的组织不能收西方的钱吗?然而,她们不只是收了西方的钱而已 女权之声组织里 有一个人叫做郑楚然 她除了女权运动之外 没有任何其他工作 表面上,是一个全职的女权工作者 在2015年的时候 她还因为寻衅滋事 被警察拘留过30多天 甚至在她被拘留的时候 希拉里还借题发挥 指责中国侵犯人权、压制民主 一个中国的小小民间组织的首领 在互联网上的粉丝还没有我多 竟然能得到希拉里这个级别的关注?我真的是惊掉了下巴 这样看来 我离希拉里也不是很远了??而不止是希拉里 这样一个明明思想上毫无建树的人 却被西方媒体BBC评为了 全球百大思想家 图:郑楚然在王宝强事件中发表的言论 除此以外 更让人匪夷所思的 是她们平时就喜欢攻击政府 甚至于,她们还会试图分裂我们国家 比如,女权之声这个组织里 著名的女权斗士洪理达 就曾经转发著名的港独媒体 Hong Kong Free Press的言论 甚至曾公开发表过 支持藏独、港独、台独的言论 她也经常和郑楚然混在一起 我很想不通 如果她们真的只是单纯的女权主义者 为何要发表分裂国家的言论?为何要支持藏独、港独、台独?我只能说,这大概就叫 拿人家的手短,吃人家的嘴软吧 以前,我在接触中国的女权组织时 我就觉得很奇怪 她们都喜欢声称 自己是不盈利的非政府组织 但是她们无论是宣传 还是组织各类活动 都需要大量的钱 如果她们真的不盈利 那这些钱都是哪里来的呢?而这些外国的金主 他们也更加不可能是什么慈善组织 大发善心来给中国人投钱 每一分投出去的钱 一定都是要有回报的 那么,他们的回报是什么呢?他们给中国的“女权组织”投钱 能得到什么利益呢?联想到中国网络上 如火如荼的对中国男人的讨伐 我只能说,细思恐极 我绝不是危言耸听 因为我们就看不远的邻国日本 近些年来日本对于西方的崇拜 可谓深入骨髓 已经到了崇洋媚外的程度 而这其中 当然也包括对白人男性的崇拜 甚至在2016年一个瑞士白人 发了一个视频,赤裸裸的说 “在东京,只要你是白人, 做什么都可以” 视频里面他在日本便利店 随意的亲吻不认识的收银员女孩 在酒吧把不认识的日本女孩 按向自己的裤裆 而日本女孩回应的却是谄媚的笑容 我想,并不会有那么多中国人 真正被西方伪女权主义控制 但是,我们要警惕的是 别在你自己都没有察觉的时候 被别有用心的人洗了脑 更有甚者 别在你自己都不知道的情况下 被别人卖给了外国男人 还去帮他数钱 本文系授权发布,From 酷玩实验室,微信号:coollabs,欢迎分享到朋友圈,未经许可不得转载,INSIGHT视界 诚意推荐 Forwarded from Official Account 酷玩实验室 酷玩实验室 Learn More Scan QR Code via WeChat to follow Official Account 采集文章采集样式近似文章查看封面