模块
1. random
- random.randint 指定一个范围随机返回这个范围内的数
- random.choice 随机返回列表或元组中的一个值
randint
from random import randint
print(randint(1,6))
choice
"""使用random模块中的choice方法制作一个彩票分析小程序,看看中彩票有多难!"""
from random import choice
my_ticket = (2,'b','b','e')
caipiao = [1,2,3,4,5,6,7,8,9,'a','b','c','d','e']
a = 0
while True:
number = []
for i in range(4):
number.append(random.choice(caipiao))
tuple1 = tuple(number)
print(f"您抽中的号码为:{tuple1}")
a += 1
if tuple1 == my_ticket:
print(f"恭喜您中奖啦!!! 本次中奖号码为: {my_ticket},请核实您抽中的号码")
print(f"a = {a}")
break
2. os
1.文件和目录操作
1)os.listdir(path) 列出指定目录下的所有文件和子目录。
import os
files_and_dirs = os.listdir("/home/user")
print(files_and_dirs)
2)os.mkdir(path,mode=0o777) 创建一个目录
os.mkdir("/home/user/newdir", mode=0o755)
3)os.makedirs(path,mode=0o777,exist_ok=False) 递归创建多级目录。
os.makedirs("/home/user/newdir/subdir", exist_ok=True)
4)os.rmdir(path) 删除一个空目录
os.rmdir("/home/user/newdir")
5)os.removedirs(path) 递归删除空目录
os.removedirs("/home/user/newdir/subdir")
6)os.rename(src,dst) 重命名文件或目录
os.rename("/home/user/oldname.txt", "/home/user/newname.txt")
7)os.remove(path) 删除文件
os.remove("/home/user/file.txt")
6)os.chmod(path,mode) 修改文件或目录的权限
os.chmod("/home/user/file.txt", 0o755)
7)os.chown(path,uid,gid) 修改文件或目录的所有者
os.chown("/home/user/file.txt", 1000, 1000)
8)os.symlink(src,dst) 创建符号链接
os.symlink("/home/user/file.txt", "/home/user/link.txt")
9)os.readlink(path) 获取符号链接的目标路径
target = os.readlink("/home/user/link.txt")
print(target)
2.文件属性和状态
1)os.path.exists(path) 检查路径是否存在
if os.path.exists("/home/user/file.txt"):
print("File exists")
2)os.path.isfile(path) 检查路径是否是普通文件
if os.path.isfile("/home/user/file.txt"):
print("It's a file")
3)os.path.isdir(path) 检查路径目录是否存在
if os.path.isdir("/home/user"):
print("It's a directory")
4)os.path.getsize(path) 获取文件大小(字节)
size = os.path.getsize("/home/user/file.txt")
print(f"File size: {size} bytes")
5)os.path.getmtime(path) 获取文件最后修改的时间(时间戳)
import time
mtime = os.path.getmtime("/home/user/file.txt")
print(time.ctime(mtime))
3.环境变量和路径的操作
1)os.environ 获取环境变量。
home_dir = os.environ.get("HOME")
print(home_dir)
2)os.path.join(path,*paths) 安全的拼接路径
full_path = os.path.join("/home", "user", "file.txt")
print(full_path)
3)os.path.abspath(path) 获取路径的绝对路径
abs_path = os.path.abspath("file.txt")
print(abs_path)
4)os.path.basename(path) 获取路径中的文件名部分
filename = os.path.basename("/home/user/file.txt")
print(filename)
5)os.path.dirname(path) 获取路径中的目录部分
dirname = os.path.dirname("/home/user/file.txt")
print(dirname)
4.进程和系统操作
1)os.system(command) 执行系统命令
os.system("ls -l")
2)os.fork() 创建子进程
pid = os.fork()
if pid == 0:
print("Child process")
else:
print("Parent process")
3)os.kill(pid,sig) 发送信号到进程
os.kill(pid, signal.SIGTERM)
4)os.wait() 等待子进程结束
os.fork()
os.wait()
3. sys
1.sys.argv 获取命令行参数
import sys
print("Script name:", sys.argv[0]) # 脚本名称
print("Arguments:", sys.argv[1:]) # 其他参数
- 案例:判断文件是否存在
#!/usr/bin/python3
#_*_coding:utf-8_*_
import os
import sys
def main():
# sys.argv.append("") #如果用户未传递参数会触发异常,所以先将参数设置为空
# filename = sys.argv[1]
for filename in sys.argv[1:]:
if not os.path.isfile(filename):
raise SystemExit(filename + ' does not exists ')
elif not os.access(filename,os.R_OK):
raise SystemExit(filename + ' is not accessible ')
else:
print(filename + ' is accessible ')
if __name__ == '__main__':
main()
2.sys.path 获取python模块搜索路径
print("Module search path:", sys.path)
3.sys.modules 获取已加载模块列表
print("Loaded modules:", list(sys.modules.keys()))
4.sys.exit([status]) 退出脚本
if error:
print("Error occurred")
sys.exit(1) # 非零状态码表示失败
5.sys.stdin 标准输入流
user_input = sys.stdin.readline().strip() #交互式输入内容
print("You entered:", user_input)
6.sys.stderr 标准错误流
sys.stderr.write("Error occurred!\n")
print("Platform:", sys.platform)
if sys.platform.startswith("linux"):
print("Running on Linux")
8.sys.exc_info() 获取当前异常信息(返回一个包含异常类型、异常实例和回溯对象的元组。)
try:
1 / 0
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
print("Exception type:", exc_type)
print("Exception value:", exc_value)
9.sys.signals 信号处理
import signal
import sys
def signal_handler(sig, frame):
print("Signal received:", sig)
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
print("Press Ctrl+C to exit")
signal.pause()
4. time
1.获取当前时间
time.time() 和 time.localtime()
import time
# 获取当前时间的时间戳(自1970年1月1日以来的秒数)
timestamp = time.time()
print("Current timestamp:", timestamp)
# 获取当前时间的结构化表示(年,月,日,小时,分钟,秒)
local_time = time.localtime()
print("Local time:", local_time)
2.时间延迟
time.sleep()
# 暂停执行指定秒数
time.sleep(5)
print("Waited 5 seconds")
3.格式化时间
# 将时间戳格式化为可读字符串
formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
print("Formatted time:", formatted_time)
5. re
正则表达式模式
| 模式 |
描述 |
| ^ |
匹配字符串的开头 |
| $ |
匹配字符串的末尾。 |
| . |
匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
| [...] |
用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k' |
| [^...] |
不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
| re* |
匹配0个或多个的表达式。 |
| re+ |
匹配1个或多个的表达式。 |
| re? |
匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
| re |
精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。 |
| re |
匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。 |
| re |
匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
| a| b |
匹配a或b |
| (re) |
对正则表达式分组并记住匹配的文本 |
| (?imx) |
正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。 |
| (?-imx) |
正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。 |
| (?: re) |
类似 (...), 但是不表示一个组 |
| (?imx: re) |
在括号中使用i, m, 或 x 可选标志 |
| (?-imx: re) |
在括号中不使用i, m, 或 x 可选标志 |
| (?#...) |
注释. |
| (?= re) |
前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
| (?! re) |
前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
| (?> re) |
匹配的独立模式,省去回溯。 |
| \w |
匹配字母数字及下划线 |
| \W |
匹配非字母数字及下划线 |
| \s |
匹配任意空白字符,等价于 [ \t\n\r\f]。 |
| \S |
匹配任意非空字符 |
| \d |
匹配任意数字,等价于 [0-9]. |
| \D |
匹配任意非数字 |
| \A |
匹配字符串开始 |
| \Z |
匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
| \z |
匹配字符串结束 |
| \G |
匹配最后匹配完成的位置。 |
| \b |
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
| \B |
匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
| \n, \t, 等. |
匹配一个换行符。匹配一个制表符。等 |
| \1...\9 |
匹配第n个分组的内容。 |
| \10 |
匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
7. subprocess
| 参数名 |
类型 |
描述 |
默认值 |
| args |
list 或 str |
命令及其参数。如果是列表,则直接传递给程序;如果是字符串,则使用 shell 解释器。 |
必需 |
| shell |
bool |
是否在 shell 环境中执行命令。 |
False |
| stdout |
file descriptor, subprocess.PIPE, int, None |
标准输出的处理方式。 |
None(输出到控制台) |
| stderr |
file descriptor, subprocess.PIPE, int, None |
标准错误输出的处理方式。 |
None(输出到控制台) |
| stdin |
file descriptor, subprocess.PIPE, int, None |
标准输入的处理方式。 |
None(不提供输入) |
| universal_newlines |
bool |
如果为 True,则输入和输出被处理为字符串;如果为 False,则被处理为字节。 |
False |
| capture_output |
bool |
如果为 True,则捕获标准输出和标准错误输出。 |
False |
| text |
bool |
别名 universal_newlines,在 Python 3.7 中引入,用于简化文本模式的使用。 |
False |
| cwd |
str, None |
指定工作目录。 |
当前工作目录 |
| env |
dict, None |
指定环境变量。 |
当前环境变量 |
| preexec_fn |
callable, None |
在子进程执行前调用的函数。 |
None |
| close_fds |
bool |
是否关闭子进程的文件描述符。 |
True |
| startupinfo |
subprocess.STARTUPINFO, None |
Windows 平台上的启动信息。 |
None |
| creationflags |
int, None |
Windows 平台上的创建标志。 |
0 |
| check |
bool |
如果为 True,则命令执行失败时抛出 subprocess.CalledProcessError 异常。 |
False |
| encoding |
str, None |
指定输入和输出的编码。 |
None(使用系统默认编码) |
| errors |
str |
指定编码错误的处理方式(strict, ignore, replace)。 |
未指定 |
以下是一些使用 subprocess.run() 的示例:
| 示例描述 |
代码示例 |
| 执行命令并捕获输出 |
subprocess.run(['ls', '-l'], capture_output=True, text=True) |
| 执行命令并检查结果 |
subprocess.run(['ls', '/non_existent_directory'], capture_output=True, text=True, check=True) |
| 执行命令并指定工作目录 |
subprocess.run(['ls', '-l'], cwd='/home/user', text=True) |
| 执行命令并指定环境变量 |
subprocess.run(['python', 'script.py'], env={'PATH': '/usr/bin'}) |
| 执行命令并处理编码 |
subprocess.run(['command'], encoding='utf-8') |
- Popen.wait()和Popen.communicate()方法
- Popen对象创建后主程序并不会自动等待子进程完成。所以我们必须执行wait或communicate方法,父进程才会等待
- wait和communicate方法都是用来等待外部程序执行结束并获取返回值,这也意味着调用它们就开始执行外部命令了。
- 如果stdout或stderr参数都是PIPE,并且程序输出超过操作系统管道长度时,使用wait会导致死锁,因此官方建议使用communicate
9. psutil
- psutil默认以字节显示(整型int),直接除以3个1024可转换为GB
9.1 获取系统性能信息
cpu
| 字段名称 |
含义 |
说明 |
user |
用户态 CPU 时间 |
CPU 在用户态下运行普通用户程序所占用的时间。 |
nice |
低优先级用户态 CPU 时间 |
CPU 在用户态下运行低优先级进程(通过 nice 命令调整优先级的进程)所占用的时间。 |
system |
内核态 CPU 时间 |
CPU 在内核态下运行内核代码(如设备驱动程序、文件系统操作等)所占用的时间。 |
idle |
空闲 CPU 时间 |
CPU 处于空闲状态的时间,即 CPU 没有执行任何任务的时间。 |
iowait |
I/O 等待时间 |
CPU 等待 I/O 操作完成的时间(如磁盘读写操作)。 |
irq |
硬件中断时间 |
CPU 处理硬件中断(如键盘、鼠标、网卡等外部设备触发的中断)所占用的时间。 |
softirq |
软件中断时间 |
CPU 处理软件中断(如网络协议栈处理、定时器中断等)所占用的时间。 |
steal |
被虚拟机偷走的时间 |
在虚拟化环境中,CPU 时间被宿主机或其他虚拟机占用的时间。在物理机上通常为 0.0。 |
guest |
运行虚拟机的时间 |
CPU 在运行虚拟机(如 KVM、Xen 等)时所占用的时间。在物理机上通常为 0.0。 |
guest_nice |
运行低优先级虚拟机的时间 |
CPU 在运行低优先级虚拟机时所占用的时间。在物理机上通常为 0.0。 |
#CPU信息
cpu = psutil.cpu_times()
print(cpu)
print(f"user:{cpu.user},system:{cpu.system},idle:{cpu.idle}")
内存
#内存信息
mem = psutil.virtual_memory() #使用virtual_memory()获取内存的完整信息
print(mem)
print(f"total:{mem.total},used:{mem.used}")
mem_swap = psutil.swap_memory() #使用swap_memory()获取系统swap交换分区完整信息
print(f"swap:{mem_swap}")
磁盘
#磁盘信息(重点关注磁盘利用率和io读写数)
disk = psutil.disk_partitions() #disk_partitions()获取磁盘的完整信息
print(disk)
disk_usage = psutil.disk_usage('/') #disk_usage('/')指定分区使用情况利用率
print(disk_usage)
disk_io = psutil.disk_io_counters() #disk_io_counters()获取磁盘的总io数
print(disk_io)
disk_io_one = psutil.disk_io_counters(perdisk=True) #disk_io_counters(perdisk=True)获取单个磁盘的io数
print(disk_io_one)
网络
- 网络信息重点关注: bytes_sent=579758412(发送字节数),bytes_recv=1744587596(接收字节数), packets_sent=3704487(发送数据包数),packets_recv=5320867(接收数据包数)
#网络信息
net = psutil.net_io_counters(pernic=True) #net_io_counters()输出总的网络io信息,pernic=True输出每个网络接口的io信息
print(net)
其他信息
In [39]: psutil.users()
Out[39]: [suser(name='root', terminal='pts/2', host='111.26.86.20', started=1738993613.0, pid=191667)]
In [40]: import psutil,datetime
In [41]: psutil.boot_time() #返回时间戳
Out[41]: 1733188166.0
In [42]: datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
Out[42]: '2024-12-03 09:09:26'
案例: 给出进程名输出该进程信息
#!/usr/bin/python3
#_*_coding:utf-8_*_
import psutil
import sys
def print_proc_name(proc_names):
#psutil.pids()默认返回为列表
pids_list = psutil.pids()
try:
for pid in pids_list:
for proc_name in proc_names:
p = psutil.Process(pid)
if p.name() == proc_name:
print(p)
except Exception as e:
print(str(e))
if __name__ == '__main__':
print_proc_name(sys.argv[1:]) #获取用户指定的参数
9.2 系统进程管理
In [1]: import psutil
In [3]: psutil.Process(178951) #实例化一个进程对象,参数为进程pid
Out[3]: psutil.Process(pid=178951, name='nginx', status='sleeping', started='2025-02-05 16:02:15')
In [5]: p.name() #进程名
Out[5]: 'nginx'
In [6]: p.exe() #进程bin路径
Out[6]: '/usr/sbin/nginx'
In [7]: p.cwd() #进程的工作目录
Out[7]: '/'
In [8]: p.status() #进程状态
Out[8]: 'sleeping'
In [9]: p.create_time() #进程创建时间
Out[9]: 1738742535.53
In [10]: p.uids()
Out[10]: puids(real=0, effective=0, saved=0)
In [11]: p.gids()
Out[11]: pgids(real=0, effective=0, saved=0)
In [12]: p.cpu_times() #进程的cpu时间,包括user,system
Out[12]: pcputimes(user=0.0, system=0.0, children_user=0.0, children_system=0.0, iowait=0.0)
In [13]: p.cpu_affinity() #进程的cpu亲和度
Out[13]: [0, 1]
In [14]: p.memory_percent() #进程内存利用率
Out[14]: 0.09876393318608247
In [15]: p.memory_info() #进程内存的rss,vms信息(进程的物理内存和逻辑内存)
Out[15]: pmem(rss=1732608, vms=56537088, shared=20480, text=786432, lib=0, data=1482752, dirty=0)
In [16]: p.io_counters() #进程的读写情况
Out[16]: pio(read_count=0, write_count=0, read_bytes=0, write_bytes=0, read_chars=0, write_chars=0)
In [17]: p.connections() #返回打开进程的socket列表
<ipython-input-17-d50301053d22>:1: DeprecationWarning: connections() is deprecated and will be removed; use net_connections() instead
p.connections()
Out[17]:
[pconn(fd=6, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=80), raddr=(), status='LISTEN'),
pconn(fd=7, family=<AddressFamily.AF_INET6: 10>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='::', port=80), raddr=(), status='LISTEN')]
In [18]: p.num_threads() #进程打开的线程数
Out[18]: 1