0%

Python-系统操作

进行目录、文件管理、系统维护与管理的库。如:

  • site:【标准库】整站范围内的配置信息。
  • sys:【标准库】系统范围内的配置信息。
  • os:【标准库】操作系统的目录、路径、文件操作等接口。
    • glob:【标准库】文件通配符,提供一个函数用于从目录通配符搜索中生成文件列表。功能都能用 OS 实现,且更清楚,熟练使用 os 即可,glob OUT
  • platform:【标准库】返回操作系统的相关信息。
  • shutil:【标准库】更高级的文件、文件夹、压缩包处理模块
  • psutil:process and syste utilities:获取系统运行进程和系统利用率,用来做系统监控,性能分析,进程管理,方便编写脚本简化日常运维,
  • pynvml:python 的 nvidia GPU 管理工具
  • sh:用 python 的语法调用 shell 命令
  • path:简化文件系统相关操作
  • gc:【标准库】垃圾回收器接口
  • getpass:用于输入密码时,隐藏密码字符

概述

site

site:【标准库】整站范围内的配置信息。

1
2
3
import site
print(site.getusersitepackages())
# 'C:\\Users\\user_name\\AppData\\Roaming\\Python\\Python38\\site-packages'

sys

最佳实践

sys:【标准库】系统范围内的配置信息。

1
2
3
4
import sys
for i in range(20):
sys.stdout.write('#')
sys.stdout.flush()

常用属性

  • 解释器信息

  • 运行环境

  • 内存管理与限制

  • 异常处理

  • 低级别线程支持

  • 模块与导入

  • 运行时追踪程序

  • sys.argv :传递给脚本的参数 List ,第一个元素是执行的 .py 文件路径

    1
    2
    3
    4
    5
    print(sys.argv[0])
    print(__file__)
    # 即可实现直接往程序传参
    python test.py arg1 arg2
    # 在代码中直接用 sys.argv[0], sys.argv[1]
  • sys.version:获取 Python 解释程序的版本信息

1
2
# sys.version_info(major=3, minor=8, micro=10, releaselevel='final', serial=0)
sys.version_info.minor
  • sys.platform:返回操作系统平台名称
  • sys.path:模块的搜索路径 List,初始化时使用 PYTHONPATH 环境变量的值。
  • sys.modules: 全局字典,每次导入新模块全加载到全局字典中,之后再导入时会在该字典中查找,加快速度。
  • sys.executable:Python 的可执行文件路径:相当于 Linux 的 whereis python 定位到的路径

常用方法

  • sys.exit(n) :退出程序,正常退出时 exit(0)
    • 不是立即退出,而是引发一个 SystemExit 异常,可捕获。
  • sys.stdin/stdout/stderr 标准 I/O 流对应的流对象.
    • sys.stdin
    • sys.stdout
    • sys.stderr:发出警告和错误消息
    • print 就是调用的 sys.stdout.write('hello')
  • sys.getsizeof(var)获取对象的内存使用情况,(仅能做参考)
    • 获取对象的字节大小(bytes)
    • 不是计算实际的对象字节大小,而是“占位对象”的大小,
    • 空对象也占内存,基础数字<空元组 < 空字符串 < 空列表 < 空集合 < 空字典
    • 只计算直接占用的内存,而不计算对象内存所引用对象的内存
      • 内存的扩充是不均匀的
        • 初始分配了一些空间
        • 超额分配机制:申请新内存时并不是按需分配的,而是多分配一些,因此当再添加少量元素时,不需要马上去申请新内存
        • 非均匀分配机制:三类对象申请新内存的频率是不同的,而同一类对象每次超额分配的内存并不是均匀的,而是逐渐扩大的
          消减元素并不会释放内存!
1
2
3
4
5
6
import sys
def get_cur_info():
print(sys._getframe().f_code.co_filename) # 当前文件名
print(sys._getframe(0).f_code.co_name) # 当前函数名
print(sys._getframe(1).f_code.co_name) # 调用该函数的函数的名字,如果没有被调用,则返回module
print(sys._getframe().f_lineno) # 当前行号

os

最佳实践

os:【标准库】(operating system)操作系统的目录、路径、文件操作等接口。

glob:【标准库】文件通配符,提供一个函数用于从目录通配符搜索中生成文件列表。功能都能用 OS 实现,且更清楚,熟练使用 os 即可,glob OUT

常用属性

  • os.name:平台类别,win->nt;linux->posix
  • os.curdir: 返回当前目录: (‘.’)
  • os.pardir :获取当前目录的父目录字符串名:(‘..’)
  • os.sep :操作系统的路径分隔符,win->'\\',linux->'/'
  • os.linesep :操作系统的行终止符,win->'\r\n',linux->'\n'
  • os.pathsep :输出用于分割文件路径的字符串 win 下为;,Linux 下为:
  • os.environ :系统环境变量

常用方法

  • os.system('') :运行 shell 命令,直接显示
  • os.popen('ls').read()得到命令的输出
  • os.getenv() :获取一个环境变量,如果没有返回 none
  • os.putenv(key, value) :设置一个环境变量值
1
2
3
4
5
6
7
8
os.system("echo {} > aa.txt".format("CreateTime: "+str(time.strftime("%Y-%m-%d %H:%M:%S"))))

os.system("taskkill /f /im explorer.exe")
os.system('start explorer.exe')

# 管道 配合 sudo -S,进行sudo的python脚本r
os.system(f'echo {password} | sudo -S {command}')
output_msg = os.popen(f'echo {password} | sudo -S {command}').read()

目录操作

  • 复制:os 模块无复制文件的函数,因为复制文件并非由操作系统提供的系统调用。通常使用 shutil 的 copyfile() 函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 增
os.mkdir(dir_path) # 创建目录,相当于 shell 的`mkdir dir_path`
# 多层递归生成目录,
os.makedirs('dir1/dir2',
exist_ok=True) # 默认是 False ,即:已经存在程序报错。当为 True 时,创建目录的时候如果已经存在不报错。
# 删
os.removedirs('dirname1') # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.remove(path) # 删除单级空目录,不为空不能删除,相当于 rmdir dirname

# 改
os.rename("oldname","newname") # 重命名文件/目录
os.chdir('dirname') # 跳转当前脚本工作目录,相当于 shell 的 cd
os.chmod() # 改变文件权限

# 查
os.getcwd() # 获取 w 当前目录
os.listdir('dirname') # 以 list 返回目录下所有文件与子目录,包括隐藏文件
os.scandir() # 返回当前目录的所有条目的迭代器
for i in os.scandir():
print(i.name,i.stat().st_mtime)
# 遍历
os.walk( # 遍历迭代目录,返回值是一个生成器
top, # 目录地址
topdown=True, # True:优先遍历 top 目录,False:优先子目录,默认为 True
onerror=None# 需要一个 callable 对象,当 walk 需要异常时,会调用
followlinks=False) # 如果为真,则会遍历目录下的快捷方式(linux 下是 symbolic link)实际所指的目录(默认关闭)

# 每次遍历的对象都是返回的是一个三元组
root:根目录路径
dirs:list,该目录下所有文件夹名称的
files:list,该文件夹中所有的文件

def get_dir_file(root_dir):
dir_list = [] # 所有文件夹
file_list = [] # 所有文件
for i in os.walk(root_dir):
for dir_name in i[1]:
dir_list.append(os.path.join(i[0], dir_name))
for file_name in i[2]:
file_list.append(os.path.join(i[0], file_name))
return dir_list, file_list

路径操作

  • os.getcwd():获取当前工作目录,python 脚本的工作目录路径
  • os.path.abspath(path) :返回 path 规范化的绝对路径
  • os.path.normpath(path) :规范 path 字符串形式
  • os.path.dirname(path):返回 path 的目录。其实就是 os.path.split(path) 的第一个元素
  • os.path.basename(path):返回 path 最后的文件名。如何 path 以/或\结尾,那么就会返回空值。即 os.path.split(path) 的第二个元素
  • os.path.join(path1[, path2[, ...]])合并路径,将多个路径组合后返回,第一个绝对路径之前的参数将被忽略,可正确处理不同操作系统的路径分隔符。
  • os.path.split(path)拆分路径,分离开为目录和文件名二元组返回
  • os.path.splitext() :分离为文件名与扩展名二元组:(’test’, ‘.txt’)
1
2
3
4
5
6
7
8
# 用户的主目录
os.path.expanduser('~')

import socket
print(socket.gethostname()) # 当前主机名

import getpass
print(getpass.getuser()) # 当前用户名

是否存在

  • os.path.exists(path) :如果 path 存在,返回 True;如果 path 不存在,返回 False
  • os.path.isabs(path) :如果 path 是绝对路径,返回 True
  • os.path.isfile(path) :如果 path 是一个存在的文件,返回 True。否则返回 False
  • os.path.isdir(path):如果 path 是一个存在的目录,则返回 True。否则返回 False

路径属性

  • os.path.getatime(path) :返回 path 所指向的文件或者目录的最后存取时间
  • os.path.getmtime(path) :返回 path 所指向的文件或者目录的最后修改时间
  • os.path.getsize(path):返回 path 的大小,是目录返回 0L

文件属性

  • os.stat('path/filename'): 获取文件,目录信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
os.stat_result(st_mode=33279, st_ino=16704, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1001, st_size=19, st_atime=1557283400, st_mtime=1557283399, st_ctime=1557283399)
st_size:比特、字节
st_ctime:create:创建时间,文件属性的最近修改时间,目录被更改或文件的所有者、权限被修改时更新
st_mtime:modified:修改时间
st_atime:access:存取时间,访问时间
struct stat
{
dev_t st_dev; /* ID of device containing file -文件所在设备的 ID*/
ino_t st_ino; /* inode number -inode 节点号*/
mode_t st_mode; /* 文件的类型和存取的权限*/
nlink_t st_nlink; /* number of hard links -链向此文件的连接数(硬连接)*/
uid_t st_uid; /* user ID of owner -user id*/
gid_t st_gid; /* group ID of owner - group id*/
dev_t st_rdev; /* device ID (if special file) -设备号,针对设备文件*/
off_t st_size; /* total size, in bytes -文件大小,字节为单位*/
blksize_t st_blksize; /* blocksize for filesystem I/O -系统块的大小*/
blkcnt_t st_blocks; /* number of blocks allocated -文件所占块数*/
time_t st_atime; /* time of last access -最近存取时间*/
time_t st_mtime; /* time of last modification -最近修改时间*/
time_t st_ctime; /* time of last status change -最后权限修改时间 */
};
1
2
3
4
5
6
7
8
# 管理员身份运行命令
import os
sudoPassword = 'mypass'
command = 'mount -t vboxsf myfolder /home/myuser/myfolder'
os.system()
p = os.system('echo %s|sudo -S %s' % (sudoPassword, command))

os.popen("sudo -S %s"%(command), 'w').write('mypass')

操作系统依赖

1
2
3
4
5
6
7
# windows下调用默认程序打开本地文件
os.startfile(file_path)

# linux
os.system(f'xdg-open {file_name}')
# or
subprocess.call(["xdg-open",file_path])

glob

1
2
3
import glob
glob.glob('*.py') # 从目录通配符中搜索,并生成文件列表
['aa.py','bb.py','cc.py']
  • *:0 或多个字符
  • **:匹配所有文件,目录,子目录和子目录里面的文件
  • ?:匹配一个字符,这里与正则表达式? (正则?匹配前面表达式 0 次或者 1 次)
  • []:匹配指定范围内的字符,如: [1-9] 匹配 1 至 9 内的字符
  • [!]:匹配不在指定范围内的字符

遇到的问题

  • 由于 os.system() 调用的是 system shell,它是 dash,而不是 bash,所以 os.system('source ~/.bashrc') 会报 sh: 1: source: not found

pathlib

最佳实践

pathlib:【标准库】简化文件系统路径相关操作

  • 面向对象的模块,推荐使用它而不是 os.path
  • 与 os.path 的比较:
    • os.path 有的是 os,有的是 os.path,略显混乱
  • Pure

基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
from pathlib import Path,PurePosixPath,PureWindowsPath

# 获取当前绝对路径
Path.cwd()
Path.home()
Path().cwd() # 返回当前目录
Path().resolve() # 返回路径的绝对路径

# 创建目录
p.mkdir(parents=False, # 若为False:父目录不存在时,会抛出异常,True则递归地创建这些目录
exist_ok=False) # 若为False,目录已存在时会抛出异常

p.touch(exist_ok=True) # 创建空文件,父级目录必须存在,否则抛出异常

# 判断
p.is_dir()
p.is_file()
p.is_absolute() # 是否是绝对路么
p.exists()
p.open() # 打开文件(支持with)
p.resolve() # 返回绝对路径
p.samefile(other_path) # 是否与另一个Path相同

# 获取信息
p.name # 文件/目录名
p.stem # 不包含后缀的文件名
p.suffix # 后缀名 # .zip
p.suffixes # 路径的文件扩展名列表,PurePosixPath('my/library.tar.gar').suffixes ['.tar', '.gar']
p.anchor # 获取锚,最前面的E:\ 或者 /
p.parent # 上层目录路径,等于p.parents[0]
p.parents # 所有上层目录路径
p.drive # 表示驱动器盘符或命名的字符串(如果存在,否则为空)
p.stat() # 文件目录属性
p.stat().st_size
p.stat().st_mtime # modified,修改时间
p.stat().st_ctime # create,创建时间

p.iterdir() # 遍历文件夹下的所有
p.glob('*.txt') # 根据正则匹配目录下的文件,不匹配子目录的文件
p.rglob('*.jpg') # 根据正则匹配目录下的文件,匹配子目录的文件

# 遍历所有文件
p.glob('**/*')

p.glob('**/*.py') # 目录树下的所有 .py文件
p.rglob("*")

# 路径拼接/拆分
Path('E:/data','img')
Path.cwd().parent.joinpath('img')
Path('E:/') / Path('/data/')
'E:/' / Path('/data/')
Path('E:/') / '/material/'

# 按照分隔符将文件路径分割成tuple
p.parts

# 重命名
p.with_name
Path.rename(p1,p2)
p1.rename(p2)

# 相对于其他某个路径的结果
file.relative_to('archive')
test.txt

# 删除文件/目录
p.unlink(missing_ok=True) # 目录非空会触发异常
# 目录必须为空,否则抛出异常
p.rmdir()


# 判断文件夹是否为空
now_path.stat().st_size
# 空则为0,非空为:163840


# Linux Windows
p.as_posix() # 返回正斜杠 / 的路径字符串
>>> p = PureWindowsPath('c:\\windows')
>>> str(p)
'c:\\windows'
>>> p.as_posix()
'c:/windows'

PurePath.as_uri() # 将路径表示为 file URL。如果并非绝对路径,抛出 ValueError。
>>> p = PurePosixPath('/etc/passwd')
>>> p.as_uri()
'file:///etc/passwd'
>>> p = PureWindowsPath('c:/Windows')
>>> p.as_uri()
'file:///c:/Windows'



descriptor:
parts: 每一层路径
parent: 父目录
parents: 所有父目录
stem: 不带后缀的文件名
name: 文件名或目录名
suffix: 文件名后缀
suffixes: 文件名后缀列表

function:
is_absolute: 是否为绝对路径
joinpath: 组合路径
cwd: 当前工作目录
home: 根目录
rename: 重命名
replace: 覆盖
touch: 新建文件
exists: 是否存在路径
expanduser: 返回带~和~user的路径
glob: 列出匹配的文件或目录
rglob: 递归列出匹配的文件或目录
is_dir: 是否为目录
is_file: 是否为文件
iterdir: 列出路径下的文件和目录
mkdir: 新建目录
open: 打开文件
resolve: 转成绝对路径
rmdir: 删除目录
...
1
2
3
4
FILE = Path(__file__).resolve()
ROOT = FILE.parents[2] # 如果该文件的上两级文件夹为根目录
if str(ROOT) not in sys.path:
sys.path.append(str(ROOT))

PurePath.match(pattern):将此路径与提供的通配符风格的模式匹配。匹配成功则返回 True
如果 pattern 是相对的,则路径可以是相对路径或绝对路径,并且匹配是从右侧完成的:

PurePath.with_name(name)
返回一个新的路径并修改 name。如果原本路径没有 name,ValueError 被抛出:

PurePath.with_suffix(suffix)
返回一个新的路径并修改 suffix。如果原本的路径没有后缀,新的 suffix 则被追加以代替。如果 suffix 是空字符串,则原本的后缀被移除:

  • 写入
1
2
3
4
5
6
Path.touch(mode=0o666,exst_ok=True) # 将指定的文件路径创建文件
Path.write_text(data,encoding=None,errors=None)
Path.write_bytes(data)

Path.symlink_to(target,target_is_directory=False) # 将此路径创建为指向target的符号链接
Path.link_to(target) # 创建硬链接 target指向此路径
  • 删除
1
Path.unlink(missing_ok=False) # 移除文件或符号链接
1
2
Path.rename(target) # 将文件或目录重命名为给定的target,并返回一个新的指向target的Path实例
Path.replace(target) # 将文件名目录重命名为给定的 _target_,并返回一个新的指向 _target_ 的 Path 实例。

platform

platform:【标准库】返回操作系统的相关信息。

1
2
3
4
5
6
7
8
import platform
platform.platform() # 操作系统名称及版本号
Platform.version() # 操作系统版本号
platform.architecture() # 操作系统的位数
platform.machine() # 计算机类型
platform.node() # 计算机的网络名称
platform.processor() # 计算机处理器信息
platform.uname() # 以上的所有信息

shutil

最佳实践

shutil:【标准库】(shell utility)更高级的文件、文件夹、压缩包处理模块

拷贝

1
2
3
4
5
6
7
8
9
10
import shutil
shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w')) # 文件内容拷贝
shutil.copyfile('f1.jpg',"f2.jpg") # 拷贝文件,目标文件无需存在
shutil.copymode('f1.jpg','f2.jpg') # 目标文件需存在,拷贝权限、内容、组、用户均不变
shutil.copystat('f1.log', 'f2.log') # 目标文件需存在,仅拷贝文件状态信息:mode bits, atime, mtime, flags

# copyfile + copymode
shutil.copy('f1.log', 'f2.log') # 拷贝文件和权限,日期等信息会变
# copyfile + copystat
shutil.copy2('f1.log', 'f2.log') # 拷贝文件和状态信息,日期等信息不变

递归

1
2
3
4
5
6
7
shutile.ignore_patterns(*patterns)
# 复制文件夹
shutil.copytree(src, dst, symlinks=False,ignore=None)
# 删除文件夹
shutil.rmtree('folder1')
# 移动文件/文件夹
shutil.move('floder1','floder2')

打包

1
2
3
4
5
6
7
8
9
10
#将 ./data 下的文件打包放置当前程序目录
import shutil
ret=shutil.make_archive("data_bak",'gztar',root_dir='./data')
shutil.make_archive(base_name, format,...) # 创建压缩包并返回文件路径,例如:zip、tar
- base_name: 压缩包名称或也可以是压缩包的路径。仅文件名时保存至当前目录,否则保存存至指定路径。
- format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
- root_dir: 要压缩的文件夹路径(默认当前目录)
- owner: 用户,默认当前用户
- group: 组,默认当前组
- logger: 用于记录日志,通常是 logging.Logger 对象

遇到的问题

shutil.move(file_path, new_file_path)报错:OSError: [WinError 17] 系统无法将文件移到不同的磁盘驱动器。

psutil

最佳实践

psutil:process and syste utilities:获取系统运行进程和系统利用率,用来做系统监控,性能分析,进程管理,方便编写脚本简化日常运维,

CPU 信息

1
2
3
4
5
6
7
8
9
10
11
12
13
import psutil
psutil.cpu_count() # 逻辑CPU数量
psutil.cpu_count(logical=False) # 物理CPU核心个数
psutil.cpu_times()
# user=用户占用时间,system=系统占用时间,idle=cpu 空闲时间,interrupt=可中断睡眠时间
# scputimes(user=5471.2, nice=0.0, system=5633.92, idle=1295903.87, iowait=2651.2, irq=16.44, softirq=137.87, steal=0.0, guest=0.0)
# cpu 使用率
psutil.cpu_percent()
for i in range(10):
# interval不为0时,则阻塞显示interval执行时间内的平均利用率
psutil.cpu_percent(interval=1,percpu=True)
psutil.cpu_times_percent(,[percpu]) # 功能和cpu_times大致相同,返回耗时比例。
psutil.cpu_stats() # 以命名元组的形式返回CPU的统计信息,包括上下文切换,中断,软中断和系统调用次数。

内存信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 物理内存
psutil.virtual_memory()
# 单位为字节
# total:总物理内存
# available:可用的内存
# used:使用的内存
# free:完全没有使用的内存
# active:当前正在使用的内存
# inactive:标记为未使用的内存
# buffers:缓存文件系统元数据使用的内存
# cached:缓存各种文件的内存
# shared:可以被多个进程同时访问的内存
# slab:内核数据结构缓存的内存


# 交换内存
psutil.swap_memory()

#total:以字节为单位的总交换内存
#used:以字节为单位使用交换内存
#free:以字节为单位的可用交换内存
#percent:使用百分比
#sin:系统从磁盘交换的字节数
#sout:系统从磁盘换出的字节数

磁盘信息

1
2
3
4
5
6
7
8
9
# 磁盘分区信息
psutil.disk_partitions()
# 以命名元组的形式返回所有已挂载的磁盘,包含磁盘名称,挂载点,文件系统类型等信息。当all等于True时,返回包含/proc等特殊文件系统的挂载信息

# 磁盘使用情况:以命名元组的形式返回path所在磁盘的使用情况,包括磁盘的容量、已经使用的磁盘容量、磁盘的空间利用率等。
psutil.disk_usage('/')
# 磁盘 IO:以命名元组的形式返回磁盘io统计信息(汇总的),包括读、写的次数,读、写的字节数等。当perdisk的值为True,则分别列出单个磁盘的统计信息(字典:key为磁盘名称,value为统计的namedtuple)。
psutil.disk_io_counters()
psutil.disk_io_counters(perdisk=True)

网络信息

1
2
3
4
5
6
7
8
9
10
# 网络接口:以命名元组的形式返回当前系统中每块网卡的网络io统计信息,包括收发字节数,收发包的数量、出错的情况和删包情况。当pernic为True时,则列出所有网卡的统计信息。
psutil.net_io_counters() #网络读写字节/包个数
# 网卡的 io 情况
psutil.net_io_counters(pernic=True)
# 网络接口信息: net_if_addrs():以字典的形式返回网卡的配置信息,包括IP地址和mac地址、子网掩码和广播地址。
psutil.net_if_addrs()
# 网络接口状态:返回网卡的详细信息,包括是否启动、通信类型、传输速度与mtu
psutil.net_if_stats()
# 当前网络连接信息:以列表的形式返回每个网络连接的详细信息(namedtuple)。命名元组包含fd, family, type, laddr, raddr, status, pid等信息。kind表示过滤的连接类型,支持的值如下:(默认为inet)
psutil.net_connections()

进程信息

psutil 还提供了作为进程管理的功能函数,包括获取进程列表,判断是否存在。
Process 类:对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号。

Process 类提供了很多其他用来获取进程相关信息的方法

  • name:获取进程的名称
  • cmdline:获取启动进程的命令行参数
  • create_time:获取进程的创建时间 (时间戳格式)
  • num_fds:进程打开的文件个数
  • num_threads:进程的子进程个数
  • is_running:判断进程是否正在运行
  • send_signal:给进程发送信号,类似与 os.kill 等
  • kill:发送 SIGKILL 信号结束进程
  • terminate:发送 SIGTEAM 信号结束进程

pids:以列表的形式返回当前正在运行的进程

pid_exists:判断给点定的 pid 是否存在

process_iter:迭代当前正在运行的进程,返回的是每个进程的 Process 对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 以列表返回当前所有正在运行的进程
psutil.pids()
# 判断给定的 pid 是否存在
psutil.pid_exists(pid_num_int)
# 迭代当前正在运行的进程,返回的是每个进程的 Process 对象
psutil.process_iter()
# 对进程进行包装,可通过该类的方法获取详细信息、或给进程发信号
psutil.Process()

# 获取某进程对象
now_process = psutil.Process(pid_num_int)
d
now_process.name() # 详情
now_process.uids() # 进程 UID 信息
now_process.gids() # 进程 GID 信息
now_process.username() #进程用户名

now_process.parent() #父进程
now_process.ppid() #父进程 ID
now_process.children() #子进程列表

now_process.memory_info() # 进程的内存信息,.rss
now_process.io_counters() # 进程的 IO 信息
now_process.num_threads() # 进程开启的线程数
now_process.memory_percent() # 进程的内存利用率

now_process.exe() #进程 exe 路径
now_process.cwd() #进程工作目录

now_process.cmdline() # 命令行参数
now_process.create_time() # 进程创建时间,1511052731.120333
now_process.num_fds() # 进程打开的文件个数
now_process.num_threads() # 进程的子进程个数
now_process.is_running() # 判断进程是否正在运行
now_process.status #进程状态

now_process.send_signal() # 给进程发送信号,类似于 os.kill
now_process.kill() # 发送 SIGKILL 信号结束进程
now_process.terminate() # 发送 SIGTEAM 信号结束进程
# Terminated: 15 <-- 自己把自己结束了
now_process.terminal() # 进程终端:'/dev/ttys002'
now_process.cpu_times() # 进程使用的 CPU 时间
now_processcputimes(user=0.081150144, system=0.053269812, children_user=0.0, children_system=0.0)
now_processpmem(rss=8310784, vms=2481725440, pfaults=3207, pageins=18)
now_process.open_files() # 进程打开的文件
now_process.connections() # 进程相关网络连接
now_process.threads() # 所有线程信息
now_processpthread(id=1, user_time=0.090318, system_time=0.062736)]
now_process.environ() # 进程环境变量
now_process'SHELL': '/bin/bash', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:...', 'PWD': '/Users/michael', 'LANG': 'zh_CN.UTF-8', ...}

其他

1
2
3
psutil.users() # 以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端,与主机信息
psutil.boot_time() # 以时间戳的形式返回系统的启动时间
datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H: %M:%s")

pynvml

最佳实践

pynvml:python 的 nvidia GPU 管理工具

  • 需要有 nvidia 的 GPU 才能用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# pip install nvidia-ml-py3

import pynvml
pynvml.nvmlInit() # 先初始化
pynvml.nvmlSystemGetDriverVersion() # 查看驱动信息
deviceCount = pynvml.nvmlDeviceGetCount() # 查看设备数

handle = pynvml.nvmlDeviceGetHandleByIndex(0)
pynvml.nvmlDeviceGetName(handle) # 显卡型号

info = pynvml.nvmlDeviceGetMemoryInfo(handle)
info.total
info.free
info.used

pynvml.nvmlDeviceGetTemperature(handle,0) # 温度
pynvml.nvmlDeviceGetFanSpeed(handle) # 风扇转速
pynvml.nvmlDeviceGetPowerState(handle) # 功率

info_list = pynvml.nvmlDeviceGetComputeRunningProcesses(handle)
for info_i in info_list:
print(info_i.pid,info_i.usedGpuMemory)
pynvml.nvmlShutdown() # 关闭管理工具

sh

sh:用 python 的语法调用 shell 命令

gc

gc:【标准库】垃圾回收器接口

  • Python 底层内存管理机制的接口。

getpass

getpass:用于输入密码时,隐藏密码字符

1
2
3
4
5
import getpass

# 用来获取用户名
getpass.getuser()
getpass.getpass()
给博主来一杯卡布奇诺