第三方模块与包-包管理工具pip,三方模块psutil获取系统信息,进程管理,执行终端命令,top+自定义模块与包基础
一 python包管理工具pip
1. 说明:提供了对Python第三方模块的查找、下载、安装、卸载等功能
2. 常用命令
命令 | 描述 |
---|---|
pip install <模块名> # 最新版本 pip install <模块名> == 1.0.4 # 指定版本 !!可通过- i指定国内镜像网站地址 |
安装模块,自动下载到 Python的Lib/ite-packages目录下 |
pip uninstall <模块名> | 卸载模块 |
pip list | 列出已安装的模块(pip模块管理的内置模块+手动安装模块) |
pip list -o | 查看可升级的模块 |
pip freeze > requirements.txt | 导出当前python解释器中已经手动安装的模块列表,并存储到文件中 |
pip install -r requirements.txt | 批量安装模块,requirements.txt文件,常用于还原项目的依赖环境。 |
pip download <模块名> -d "要保存的文件路径" | 下载模块并备份到本地指定路径。离线安装模块。 |
pip install --upgrade <包名> pip install -U <包名> | 升级包 升级指定的包,通过使用==, >=, <=, >, < 来指定一个版本号。 |
pip install --upgrade pip | 升级 pip |
3. 常用的国内pypi镜像网站下载地址:
镜像站点 | 镜像地址 |
---|---|
清华大学 | https://pypi.tuna.tsinghua.edu.cn/simple/ |
豆瓣 | http://pypi.douban.com/simple/ |
中国科技大学 | https://pypi.mirrors.ustc.edu.cn/simple/ |
阿里云 | http://mirrors.aliyun.com/pypi/simple/ |
4 设置pip下载安装模块使用的镜像站点:
4.1 pip install <模块名> -i http://pypi.tuna.tsinghua.edu.cn/simple/
4.2
vim ~/pip.ini # pip.ini文件内容格式如下: [global] #设置pip默认下载安装模块的镜像源服务器地址 index-url = http://pypi.tuna.tsinghua.edu.cn/simple [install] #设置信任的镜像源的域名 trusted-host=pypi.tuna.tsinghua.edu.cn # :wd 保存退出即可
二 第三方模块
1 psutil
1.1 说明:和内置os模块作用 一样,但专注服务器管理。其提供了便利的函数用来获取系统的信息,如CPU,内存,磁盘,网络等。还可以用来进行进程管理,包括判断进程是否存在、获取进程列表、获取进程详细信息等。和提供了许多命令行工具提供的功能,包括:ps,top,lsof,netstat,ifconfig, who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。
1.2 按函数功能分类:
1.2.1 CPU、磁盘、内存、网络等
函数 | 描述 | 示例 |
---|---|---|
cpu_count(,[logical]) | 获取CPU的个数,默认获取CPU内核个数,当logical=False时,获取物理CPU的个数。 |
import psutil |
cpu_times(,[percpu]) | 获取系统CPU时间信息,percpu=True表示获取每个CPU的时间信息 |
"""获取系统CPU时间信息""" |
cpu_percent(,[percpu],[interval]) | 读取CPU的利用率,percpu=True时显示所有物理核心的利用率,interval!=0时,则阻塞时显示interval执行的时间内的平均利用率 |
"""查看cpu利用率""" |
cpu_freq([percpu]) | 返回cpu频率,percpu=True时,返回单个cpu频率 |
"""CPU的频率""" |
getloadavg() | 以元组的形式返回最近1、5和15分钟内的平均系统负载。 |
"""以元组的形式返回最近1、5和15分钟内的平均系统负载。""" |
virtual_memory() | 获取系统物理内存的使用情况 |
"""获取内存信息""" """以人类可读的方式输出内存大小""" |
swap_memory() | 获取系统交换内存的统计信息 |
"""系统交换内存统计信息""" |
disk_partitions() | 获取磁盘的分区数据 |
"""磁盘分区数据""" |
disk_usage(path) | 获取指定路径所属的分区磁盘的使用统计信息 |
"""获取指定路径所属的分区磁盘的使用统计信息""" |
net_connections(kind='inet') | 网卡的连接信息 |
"""网卡的连接信息""" |
net_if_addrs() | 网卡的地址信息 |
"""网卡的地址信息""" |
net_if_stats() | 网卡的状态信息 |
"""网卡的状态信息""" |
boot_time() | 系统启动时的时间戳 |
"""系统启动时的时间戳""" |
users() | 当前连接到操作系统的用户列表 |
"""当前连接到操作系统的用户列表""" # 终端类型如果:0或者tty则表示用户在本地终端操作,pts则表示通过网络远程操作 |
1.2.2 进程信息管理
import psutil """获取当前系统运行的所有进程ID(PID)的排序列表""" print(psutil.pids()) # # [1, 2, ... 5509, 5516, 5539] """判断指定的pid是否存在""" pid_num = psutil.pids()[-1] # psutil.pids()[-1] 仅是举例 result = psutil.pid_exists(pid_num) print(result) #True """获取指定pid的进程信息""" pid_num = psutil.pids()[-1] pid_info=psutil.Process(pid_num) print(f"进程名:{pid_info.name()}") #Python print(f"进程信息:{pid_info}") #psutil.Process(pid=4756, name='Python', status='running', started='17:09:15') print(f"启动执行命令:{pid_info.exe()}") #/Library/Frameworks/Python.framework/Versions/3.9/Resources/Python.app../Python print(f"进程工作目录:{pid_info.cwd()}") #/Users/admin/PycharmProjects/demo print(f"进程执行状态:{pid_info.status()}") #running print(f"进程创建时间:{pid_info.create_time()}") #1650359355.598663 print(f"进程uid信息:{pid_info.uids()}") #puids(real=501, effective=501, saved=501) print(f"进程gid信息:{pid_info.gids()}") #puids(real=20, effective=20, saved=20) print(f"进程的cpu时间信息:{pid_info.cpu_times()}") #pcputimes(user=0.069395368, system=0.026885328, children_user=0.0, children_system=0.0) print(f"进程内存利用率:{pid_info.memory_percent()}") #0.05965232849121094 print(f"进程的IO信息,包括读写IO数字及参数:{pid_info.io_counters()}") print(f"进程开启的线程数:{pid_info.num_threads()}") #1 """获取当前系统运行的所有进程相关信息""" for proc in psutil.process_iter(['pid', 'name', 'username']): print(proc.info) ''' {'name': 'kernel_task', 'pid': 0, 'username': 'root'} {'name': 'launchd', 'pid': 1, 'username': 'root'} ... '''
1.2.3 执行终端命令
import psutil """psutil.Popen对象,终端执行命令""" my_process=psutil.Popen(["python3","-c",'print("hello world")']) print(my_process) #psutil.Popen(pid=4880, name='python3.9', status='running', started='17:17:39')
# 用户程序的信息获取 print("用户进程的名称:{}".format(my_process.name())) #python3.9 print("用户进程的启动用户:{}".format(my_process.username())) #admin
1.2.4 实现top命令
#!/usr/bin/python import time import psutil from datetime import datetime from psutil._common import bytes2human # 获取系统启动时间 print(f"{'-'*32} 系统时间 {'-'*32}") uptime = datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S") # 系统当前本地时间 now_time = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time())) print(f"系统启动时间: {uptime}\t系统本地时间:{now_time}") # 获取系统用户 users_count = len(psutil.users()) users_list = " ".join([u.name for u in psutil.users()]) print(f"当前有{users_count}个用户:{users_list}") print(f"{'-'*32} CPU信息 {'-'*32}") # 物理cpu个数 cpu_count = psutil.cpu_count(logical=False) # 逻辑cpu个数 logical_cpu_count = psutil.cpu_count() # cpu的使用率 cpu_percent = psutil.cpu_percent(1) # cpu的平均负载 cpu_loadavg = " ".join([str(item) for item in psutil.getloadavg()]) print(f"CPU个数: {cpu_count}\t内核个数:{logical_cpu_count}\tcup使用率: {cpu_percent}%\tCPU负载参数:{cpu_loadavg}") print(f"{'-'*32} 内存信息 {'-'*32}") # 查看物理内存信息 memory = psutil.virtual_memory() free = bytes2human(memory.free) total = bytes2human(memory.total) memory_percent = (memory.total - memory.free) / memory.total print(f"总物理内存:{total}\t剩余物理内存:{free:10s}物理内存使用率:{int(memory_percent * 100)}%") # 查看交换内存信息 swap = psutil.swap_memory() free = bytes2human(swap.free) total = bytes2human(swap.total) # swap_percent = (swap.total - swap.free) / swap.total # print(f"总交换内存:{total}\t剩余交换内存:{free:10s}交换内存使用率:{int(swap_percent * 100)}%") print(f"总交换内存:{total}\t剩余交换内存:{free:10s}") print(f"{'-'*32} 网卡信息 {'-'*32}") # 获取网卡信息,可以得到得到网卡属性,连接数,当前数据等信息 net = psutil.net_io_counters() bytes_sent = bytes2human(net.bytes_recv) bytes_rcvd = bytes2human(net.bytes_sent) print(f"网卡接收数据:{bytes_rcvd}\t网卡发送数据:{bytes_sent}") # 获取磁盘数据信息 print(f"{'-'*32} 磁盘信息 {'-'*32}") io = psutil.disk_partitions() for i in io: try: o = psutil.disk_usage(i.device) print(f"设备:{i.device:12s}总容量:{bytes2human(o.total):6s}已用容量:{bytes2human(o.used):6s}可用容量:{bytes2human(o.free)}") except PermissionError: continue print(f"{'-'*32} 进程信息 {'-'*32}") # 查看系统全部进程 for pnum in psutil.pids(): p = psutil.Process(pnum) # print(f"进程名:{p.name():20.10s} 内存利用率:{p.memory_percent():.2f}\t进程状态:{p.status():10s}创建时间:{datetime.fromtimestamp(p.create_time()):%Y-%m-%d %H:%M:%S}") print(f"进程名:{p.name():20.10s} \t进程状态:{p.status():10s}创建时间:{datetime.fromtimestamp(p.create_time()):%Y-%m-%d %H:%M:%S}")
三 自定义模块与包
1 理解
模块:
基础操作 | 说明 |
初始化模块__init__.py |
注意: |
导包路径 !! |
绝对导包:从起始导包路径开始逐层目录编写路径导入模块或包 常见写法: import 模块名1,模块名2 from 包名 import * #导入一个模块下所有的内容信息到当前模块 |
相对导包:以当前代码文件执行的所在目录作为起始路径,
常见写法: from . import 模块1,模块名2 |
|
别名调用 |
import 模块名1 as 模块别名1,模块名2 as 模块别名2 作用:避免被导入的变量和当前模块中的变量产生冲突 |
限制导出 |
|
限制执行 |
问题:每次导包时,路径下的`__init__.py`和被导入的模块中的代码会自动被执行,所有会出现有些测试代码也会在导入时自动打印数据。 |
循环导包问题 |
循环导包问题:a模块导入了b模块,b模块又同时导入了a模块 循环导包的问题出现,往往是由于开发者没有有效的组织程序代码所致。因此,如果要解决此类问题,一般2种方案:
|
附:
vim setup.py from distutils.core import setup setup( name="fakerDemo", # 设置包名,pip install fakerDemo version="0.0.1", # 版本号 description="faker demo module", # 包的描述信息 author="moluo", # 作者 py_modules = [ # 设置发布的包的文件列表,只要是要发布上线的都要把路径填上 'faker_demo.person.mobile', 'faker_demo.person.nickname', 'faker_demo.company.name', 'faker_demo.company.job' ] )
2 安装/卸载模块
### 安装模块 ### # 方法1,直接通过pip安装即可: pip install fakerDemo-0.0.1.tar.gz # 方法2,对tar.gz包进行解压缩,然后通过setup安装: tar -zxvf fakerDemo-0.0.1.tar.gz cd fakerDemo-0.0.1 python setup.py install # 查看是否安装成功 pip list # 或 pip freeze ### 卸载模块 ### pip uninstall fakerDemo
3 可将模块上传至pypi平台
上传方式:
# 安装上传工具 pip install --upgrade twine -i https://pypi.tuna.tsinghua.edu.cn/simple/ # 把dist目录下的内容上传 twine upload dist/*