进行目录、文件管理、系统维护与管理的库。如:
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 siteprint (site.getusersitepackages())
sys 最佳实践 sys:【标准库】系统范围内的配置信息。
1 2 3 4 import sysfor i in range (20 ): sys.stdout.write('#' ) sys.stdout.flush()
常用属性 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.stdinsys.stdoutsys.stderr:发出警告和错误消息print 就是调用的 sys.stdout.write('hello') sys.getsizeof(var):获取对象的内存使用情况 ,(仅能做参考)获取对象的字节大小(bytes) 不是计算实际的对象字节大小,而是“占位对象”的大小, 空对象也占内存,基础数字<空元组 < 空字符串 < 空列表 < 空集合 < 空字典 只计算直接占用的内存,而不计算对象内存所引用对象的内存内存的扩充是不均匀的初始分配了一些空间 超额分配机制 :申请新内存时并不是按需分配的,而是多分配一些,因此当再添加少量元素时,不需要马上去申请新内存非均匀分配机制 :三类对象申请新内存的频率是不同的,而同一类对象每次超额分配的内存并不是均匀的,而是逐渐扩大的 消减元素并不会释放内存! 1 2 3 4 5 6 import sysdef 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) print (sys._getframe().f_lineno)
os 最佳实践 os:【标准库】(operating system)操作系统的目录、路径、文件操作等接口。
glob:【标准库】文件通配符,提供一个函数用于从目录通配符搜索中生成文件列表。功能都能用 OS 实现,且更清楚,熟练使用 os 即可,glob OUT
常用属性 os.name:平台类别,win->nt;linux->posixos.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() :获取一个环境变量,如果没有返回 noneos.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' ) 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) os.makedirs('dir1/dir2' , exist_ok=True ) os.removedirs('dirname1' ) os.remove(path) os.rename("oldname" ,"newname" ) os.chdir('dirname' ) os.chmod() os.getcwd() os.listdir('dirname' ) os.scandir() for i in os.scandir(): print (i.name,i.stat().st_mtime) os.walk( top, topdown=True , onerror=None , followlinks=False ) 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 socketprint (socket.gethostname()) import getpassprint (getpass.getuser())
是否存在 os.path.exists(path) :如果 path 存在,返回 True;如果 path 不存在,返回 Falseos.path.isabs(path) :如果 path 是绝对路径,返回 Trueos.path.isfile(path) :如果 path 是一个存在的文件,返回 True。否则返回 Falseos.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 os.startfile(file_path) os.system(f'xdg-open {file_name} ' ) subprocess.call(["xdg-open" ,file_path])
glob 1 2 3 import globglob.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,PureWindowsPathPath.cwd() Path.home() Path().cwd() Path().resolve() p.mkdir(parents=False , exist_ok=False ) p.touch(exist_ok=True ) p.is_dir() p.is_file() p.is_absolute() p.exists() p.open () p.resolve() p.samefile(other_path) p.name p.stem p.suffix p.suffixes p.anchor p.parent p.parents p.drive p.stat() p.stat().st_size p.stat().st_mtime p.stat().st_ctime p.iterdir() p.glob('*.txt' ) p.rglob('*.jpg' ) p.glob('**/*' ) p.glob('**/*.py' ) p.rglob("*" ) Path('E:/data' ,'img' ) Path.cwd().parent.joinpath('img' ) Path('E:/' ) / Path('/data/' ) 'E:/' / Path('/data/' )Path('E:/' ) / '/material/' 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 p.as_posix() >>> p = PureWindowsPath('c:\\windows' )>>> str (p)'c:\\windows' >>> p.as_posix()'c:/windows' PurePath.as_uri() >>> 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 ) Path.link_to(target)
1 Path.unlink(missing_ok=False )
1 2 Path.rename(target) Path.replace(target)
platform:【标准库】返回操作系统的相关信息。
1 2 3 4 5 6 7 8 import platformplatform.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 shutilshutil.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' ) shutil.copy('f1.log' , 'f2.log' ) 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 import shutilret=shutil.make_archive("data_bak" ,'gztar' ,root_dir='./data' ) shutil.make_archive(base_name, format ,...) - 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 psutilpsutil.cpu_count() psutil.cpu_count(logical=False ) psutil.cpu_times() psutil.cpu_percent() for i in range (10 ): psutil.cpu_percent(interval=1 ,percpu=True ) psutil.cpu_times_percent(,[percpu]) psutil.cpu_stats()
内存信息 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() psutil.swap_memory()
磁盘信息 1 2 3 4 5 6 7 8 9 psutil.disk_partitions() psutil.disk_usage('/' ) psutil.disk_io_counters() psutil.disk_io_counters(perdisk=True )
网络信息 1 2 3 4 5 6 7 8 9 10 psutil.net_io_counters() psutil.net_io_counters(pernic=True ) psutil.net_if_addrs() psutil.net_if_stats() 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() psutil.pid_exists(pid_num_int) psutil.process_iter() psutil.Process() now_process = psutil.Process(pid_num_int) d now_process.name() now_process.uids() now_process.gids() now_process.username() now_process.parent() now_process.ppid() now_process.children() now_process.memory_info() now_process.io_counters() now_process.num_threads() now_process.memory_percent() now_process.exe() now_process.cwd() now_process.cmdline() now_process.create_time() now_process.num_fds() now_process.num_threads() now_process.is_running() now_process.status now_process.send_signal() now_process.kill() now_process.terminate() now_process.terminal() now_process.cpu_times() 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 管理工具
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import pynvmlpynvml.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:【标准库】垃圾回收器接口
getpass getpass:用于输入密码时,隐藏密码字符
1 2 3 4 5 import getpassgetpass.getuser() getpass.getpass()