一 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

# :wq 保存退出即可

二 第三方模块

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个数"""
print( psutil.cpu_count() ) # 8,逻辑CPU个数
print( psutil.cpu_count(logical=False) ) # 4,物理CPU个数
cpu_times(,[percpu]) 获取系统CPU时间信息,percpu=True表示获取每个CPU的时间信息  
"""获取系统CPU时间信息"""
print( psutil.cpu_times(percpu=True) )
# scputimes(
# user=937.05, # 用户进程使用的CPU时间累计
# nice=26.94, # 优先级为负值的进程使用时间
# system=211.48, # 系统内核进程使用时间累计
# idle=1480.49, # CPU空闲时间累计
# iowait=15.02, # 等待IO花费的时间
# irq=0.0, # 硬中断时间累计
# softirq=26.94, # 软中断时间累计
# steal=0.0, # 花费在虚拟机中的时间
# guest=0.0,
# guest_nice=0.0
# )
cpu_percent(,[percpu],[interval]) 读取CPU的利用率,percpu=True时显示所有物理核心的利用率,interval!=0时,则阻塞时显示interval执行的时间内的平均利用率  
"""查看cpu利用率"""
print( psutil.cpu_percent() ) # 0.0
print( psutil.cpu_percent(percpu=True) ) # [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
cpu_freq([percpu]) 返回cpu频率,percpu=True时,返回单个cpu频率
"""CPU的频率"""
print(psutil.cpu_freq())
# scpufreq(
# current=2000, # 当前频率
# min=2000, # 最小频率
# max=2000) # 最大频率
 
getloadavg() 以元组的形式返回最近1、5和15分钟内的平均系统负载。
"""以元组的形式返回最近1、5和15分钟内的平均系统负载。"""
print(psutil.getloadavg()) # (1.90283203125, 2.0419921875, 2.09619140625)
 
virtual_memory() 获取系统物理内存的使用情况  
"""获取内存信息"""
print(psutil.virtual_memory())
# svmem(
# total=5420404736, # 总物理内存
# available=1328689152, # 可用内存
# percent=75.5, # 已用内存的百分比,percent=(total - available) / total * 100
# used=3783630848, # 已用内存
# free=112947200, # 完全未使用的空闲内存
# active=818221056, # 当前正在使用或最近使用的内存
# inactive=3860795392, # 未使用的内存
# buffers=98254848, # 缓冲区内存
# cached=1425571840, # 缓存占用内存
# shared=8818688, # 可以被多个进程同时访问的内存
# slab=289615872 # 缓存内核数据结构的内存
# )
"""以人类可读的方式输出内存大小"""
from psutil._common import bytes2human
ret = bytes2human(psutil.virtual_memory()[0])
print(ret) # 5.0G
swap_memory() 获取系统交换内存的统计信息
"""系统交换内存统计信息"""
print(psutil.swap_memory())
# sswap(
# total=0, # 总交换内存
# used=0, # 已使用的交换内存
# free=0, # 未使用过的空闲交换内存
# percent=0, # 已用交换内存的百分比,percent=(total - available) / total * 100
# sin=4064854016, # 系统累积从硬盘转入的字节数
# sout=991232 # 系统累积从硬盘转出的字节数
# )
 
disk_partitions() 获取磁盘的分区数据  
"""磁盘分区数据"""
print(psutil.disk_partitions())
# [
# sdiskpart(device='设备路径', mountpoint='挂载点路径', fstype='分区文件系统', opts='以逗号分隔的字符串,指示驱动器/分区的不同挂载选项'),
# sdiskpart(device='/dev/sda5', mountpoint='/', fstype='ext4', opts='rw,relatime,errors=remount-ro'),
disk_usage(path) 获取指定路径所属的分区磁盘的使用统计信息
"""获取指定路径所属的分区磁盘的使用统计信息"""
print(psutil.disk_usage("/"))
# sdiskusage(
# total=52044496896, # 总磁盘空间
# used=40965885952, # 已用磁盘空间
# free=8404480000, # 用户可用的空间
# percent=83.0 # 用户对磁盘的利用率
# )
 
net_connections(kind='inet') 网卡的连接信息
"""网卡的连接信息"""
# print(psutil.net_connections())
# [
# sconn(fd=套接字文件描述符(windows和Linux下为-1), family=地址族, type=地址类型, laddr=本地地址, raddr=绝对地址, status=TCP连接的状态, pid=打开套接字的进程的 PID进程ID),
 
net_if_addrs() 网卡的地址信息
"""网卡的地址信息"""
print(psutil.net_if_addrs())
# {
# 'lo': [
# snicaddr(family=地址族, address='主网卡地址', netmask='网络掩码地址', broadcast=广播地址, ptp=点对点接口(通常是 VPN)上的目标地址),
 
net_if_stats() 网卡的状态信息  
"""网卡的状态信息"""
print(psutil.net_if_stats())
# # {
# # 'lo': snicstats(isup=表示以太网电缆或 Wi-Fi 已连接, duplex=双工通信类型, speed=网卡速度, mtu=网卡的最大传输单位,以字节表示),
boot_time() 系统启动时的时间戳  
"""系统启动时的时间戳"""
print(psutil.boot_time()) #1650328320.0
users() 当前连接到操作系统的用户列表  
"""当前连接到操作系统的用户列表"""
print(psutil.users())
# [
# 用户类型(name='用户账号名', terminal='终端类型', host='客户端地址', started=创建连接的时间戳, pid=进程ID)
# 终端类型如果: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 理解

模块:是一个个扩展名为.py 的源程序文件,我们创建的每个python源程序文件都可以理解是模块 

包:是一个个保存了模块和__init__.py文件的特殊目录

项目:基于模块和包的方式来组织代码。基于包目录来组织项目代码的方式,我们也称为模块化开发。

2 自定义模块与包的基础操作

 基础操作  说明
初始化模块__init__.py

一个目录下如果存在初始化模块__init__.py,则会被python系统默认为包。而初始化模块__init__.py的作用有2个:

  • 可以编写一些导包时需要初始化执行的代码,这些代码会在包被导入时自动执行。

  • 可以把包下面一些模块导入初始化模块__init__.py中,实现简写效果。

注意:__init__.py,也可以是一个没有代码的空文件,让python可以识别当前目录是一个包而已。

 导包路径 

!!能优先使用绝对导包千万要使用绝对路径导包

绝对导包:从起始导包路径开始逐层目录编写路径导入模块或包

常见写法:

import 模块名1,模块名2
from 包名 import 模块名1,模块名2

from 包名 import * #导入一个模块下所有的内容信息到当前模块

相对导包:以当前代码文件执行的所在目录作为起始路径,基于.或者..导入模块或包

!!因为程序所在根目录默认是作为绝对导包的起始导包路径,所以相对导包路径的写法,不能应用于根目录下的文件中

常见写法:

from . import 模块1,模块名2
from .包 import 模块1,模块名2

别名调用

import 模块名1 as 模块别名1,模块名2 as 模块别名2
from 包名 import 模块名1 as 模块别名1,模块名2 as 模块别名2

作用:避免被导入的变量和当前模块中的变量产生冲突

 限制导出

python的所有模块中都提供了一个__all__魔术变量,可以限制*导出的内容。只有写在当前模块的__all__变量中的成员,才能被*导出到外界。如果模块中没有声明__all__限制导出内容,则*号可以导出当前模块所有的内容。 

 限制执行
问题:每次导包时,路径下的`__init__.py`和被导入的模块中的代码会自动被执行,所有会出现有些测试代码也会在导入时自动打印数据。
解决:每一个模块内部都存在一个魔术变量`__name__`,可以作为主程序运行时执行,而作为模块被其他文件导包时不执行。
 
 循环导包问题

循环导包问题:a模块导入了b模块,b模块又同时导入了a模块

循环导包的问题出现,往往是由于开发者没有有效的组织程序代码所致。因此,如果要解决此类问题,一般2种方案:

  1. 把导包冲突的代码合并到一个模块文件中,合并冲突的模块代码放在一起使用。

  2. 把导包语句写在局部作用域下或者写在冲突语句的后面,进行临时导包。这种方式并非时时有效,不推荐

四 模块与包的发布

1 模块打包工作

 

附:

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/*
posted on 2022-04-21 17:07  大明花花  阅读(79)  评论(0编辑  收藏  举报