Python系统编程
综述
主要标准模块
- os:与Python所在底层操作系统相对应变量、函数
- sys:与Python解释器本身相关的组件
- 文件、目录 - glob:文件名扩展
- stat:文件信息
 
- 并行开发 - threading、- _thread、- queue:运行、同步并发线程
- subprocess、- multiprocessing:启动、控制并行进程
- socket:网络连接、进程间通信
 
- 系统 - time、- timeit:获取系统时间等相关细节
- signal、- select、- shutil、- tempfile:多种系统 相关任务
 
说明
- Python中大部分系统级接口都集中在模块 - sys、- os中
- 以上模块之间具体实现不总是遵循规则 - 标准输入、输出流位于sys中,但可以将视为与操作系统 模式相关
 
- 标准输入、输出流位于
- 一些内建函数实际上也是系统接口 - open
 
Sys模块
平台、版本
| 1 | import sys | 
sys.xxxcheckinterval
| 1 | sys.getcheckinterval() | 
- 参数 - N:线程切换前执行指令的数量
 
- 对大多数程序无需更改此设置,但是可以用于调试线程性能 - 较大值表示切换频率较低,切换线程开销降低,但是对事件 的应答能力变弱
- 较小值表示切换频率较高,切换线程开销增加,对事件应答 能力提升
 
sys.hash_info
| 1 | sys.hash_info.width | 
模块搜索路径
| 1 | sys.path | 
- 返回值:目录名称字符串组成的列表- 每个目录名称代表正在运行python解释器的运行时模块 搜索路径
- 可以类似普通列表在运行时被修改、生效
 
sys.path初始化顺序
- 脚本主目录指示器:空字符串 - 脚本主目录是指脚本所在目录,不是os.getcwd()获取的当前工作目录
 
- 脚本主目录是指脚本所在目录,不是
- PYTHONPATH环境变量- 1 
 2- .bashrc 
 export PYTHONPATH=$PYTHONPATH:/path/to/fold/contains/module
- 标准库目录 
- .pth路径文件:在扫描以上目录过程中,遇到- .pth文件会 将其中路径加入- sys.path中- 1 
 2- # extras.pth 
 /path/to/fold/contains/module
导入模块顺序
导入模块时,python解释器
- 搜索内置模块,即内置模块优先级最高
- 从左至右扫描sys.path列表,在列表目录下搜索模块文件
嵌入解释器的钩子
| 1 | sys.modules | 
异常
| 1 | sys.exc_info() | 
- 返回值:(type, value, trackback)- 最近异常的类型、值、追踪对象元组
- 处理该异常的except执行之后,sys.exc_info被恢复 为原始值
 
- 追踪对象可以使用
traceback模块处理
命令行参数
| 1 | sys.argv | 
- 返回值:命令行参数列表- 首项始终为执行脚本名称,交互式python时为空字符串
 
- 参数可以自行解析,也可以使用以下标准库中模块
getopt:类似Unix/C同名工具
optparse:功能更加强大
标准流
| 1 | sys.stdin | 
- 标准流是预先打开的python文件对象 - 在python启动时自动链接到程序上、绑定至终端
- shell会将相应流链接到指定数据源:用户标准输入、文件
 
重定向
- 可以将 - sys.stdin、- sys.stdout重置到文件类的对象,实现 python内部的、普遍的重定向方式- 外部:cmd输入输出重定向
- 局部:指定print参数
 
- 任何方法上与文件类似的对象都可以充当标准流,与对象类型 无关,只取决于接口 - 任何提供了类似文件 - read方法的对象可以指定给- sys.stdin,以从该对象- read读取输入
- 任何提供了类似文件 - write方法的对象可以指定给- sys.write,将所有标准输出发送至该对象方法上
 
- 标准库
io提供可以用于重定向的类StringIO、ByteIO- 重定向之后
input方法将应用在重定向之后的流
stdin
| 1 | stdin.read() | 
- 在stdin被重定向时,若需要接受用户终端输入,需要使用
特殊接口从键盘直接读取用户输入- win:msvcrt模块
- linux:读取/dev/tty设备文件
 
- win:
退出
| 1 | sys.exit(N) | 
- 用途:当前线程以状态N退出- 实际上只是抛出一个内建的SystemExit异常,可以被正常 捕获
- 等价于显式raise SystemExit
 
- 实际上只是抛出一个内建的
- 进程退出参见
os._exit()
sys.exitfuncs
| 1 | sys.exitfuncs | 
编码
| 1 | sys.getdefaulencoding() | 
- win10中二者都是
utf-8,win7中文件名编码是mbcs
os模块
- os模块提供了POSIX工具- 操作系统调用的跨平台移至标准
- 不依赖平台的目录处理工具- os.path
 
 
- 包含在C程序、shell脚本中经常用到的所有操作系统调用,涉及 目录、进程、shell变量 
- 实践中, - os基本可以作为计算机系统调用的可移植接口 使用- 只要技术上可行,os模块都能跨平台
- 但在某些平台,os提供专属该平台的工具
 
- 只要技术上可行,
Shell变量
| 1 | os.environ | 
os.environ
os.environ可以向普通字典一样键索引、赋值
- 默认继承系统所有环境变量、命令行临时环境变量 
- 在最新的python中,对 - os.environ的键值修改将自动导出 到应用的其他部分- os.environ对象
- 进程对应shell环境变量:通过后台调用os.putenv生效, 反之不会更新os.environ
 
- python进程、链入C模块、该进程派生子进程都可以获取新的 赋值 - 子进程一般会继承父进程的环境变量设定
- 可以作为传递信息的方式
 
os.putenv
- os.putenv同时会调用C库中的- putenv(若在系统中可用) 导出设置到python链接的C库- 底层C库没有putenv则可将os.environ作为参数传递
 
- 底层C库没有
管理工具
| 1 | os.getpid() | 
移植工具
| 1 | os.sep | 
||Linux|Win|Unix|
|———|——————|———|———|
|sep|/|\|/(某些MAC:)|
|pathsep|:|;||
|curdir|.|||
|pardir|..|||
|linesep|\n|\r\n||
- 借助这些变量可以系统相关字符串操作的跨平台
- win下目录组分隔符是
\,大部分情况下看到\\是作为\转义字符,防止\和之后字符转义
- 确认不会转义时,直接使用
\也是可以的- 使用
r''表示不转义也可以直接使用\
路径名工具
判断存在
| 1 | os.path.isdir(r"C:\Users") | 
os.stat配合stat模块有更丰富的功能
路径操作
| 1 | pfile = os.path.join(r"C:\temp", "output.txt") | 
os.sep配合字符串.join、.split方法可以实现基本相同 效果
目录、文件操作
| 1 | os.mkdir(dirname) | 
os.listdir
- 返回值:包含目录中所有条目名称的列表 - 名称不带目录路径前缀
 
- 需要注意的是:文件名同样有编码 - 若参数为字节串,返回文件名列表也是字节串
- 参数为字符串,返回文件名列表也是字符串
 - open函数也可以类似使用字节串确定需要打开的文件
- glob.glob,- os.walk内部都是通过调用- os.listdir实现,行为相同
 
glob模块也有遍历目录的能力
os.walk
- 返回值:返回迭代器 - 每个元素为(dirname, subdirs, subfile)
 
- 每个元素为
- 参数 - topdown:默认- True,自顶向下返回
 
文件描述符、文件锁
| 1 | descriptor = os.open(path, flags, mode) | 
- os通过调用文件的描述符来处理文件
- 基于文件描述符的文件以字节流形式处理 - 没有字符解码、编码、换行符转换
- 除了缓冲等额外性能,基于描述符的文件和二进制文件模式 对象类似
 
- 文件流对象、工具仅仅是在基于描述符的文件的封装 - 可以通过 - .fileno()获得文件流对象对应文件描述符,- sys.stdin、- sys.stdout、- sys.stderr对应文件 描述符是:0、1、2- 1 
 2- os.write(1, b"hello world\n") 
 sys.stdout.write("hello world\n")
- 可以通过 - os.fdopen把文件描述符封装进文件流对象- 1 
 2
 3- fdfile = os.open("filename", (os.O_RDWR|os.O_BINARY)) 
 filstream = os.fdopen(fdfile, "r", encoding="utf-8",
 closefd=False)
 
os.open
| 1 | def os.open(path, | 
- 参数 - mode:需要模式标识符进行二进制操作以得到需要的模式- os.O_RDWR
- os.O_RDONLY
- os.O_WRONLY
- os.O_BINARY
- os.O_EXCL:唯一访问权,是python在并发、进程 同步情况下锁定文件最便捷的方法
- os.O_NONBLOCK:非阻塞访问
 - 其他模式选项参见os模块
 
 
- 返回值:文件描述符 - 整数代码、句柄,代表操作系统的中文件
 
退出进程
| 1 | os._exit(0) | 
异常信息
trackback模块
| 1 | import traceback, sys | 
参数处理
getopt模块
optparse模块
文件、目录
stat模块
- 包含os.stat信息相关常量、函数以便跨平台使用
| 1 | import stat | 
os.path中包含常用部分相同功能函数
glob模块
glob.glob
| 1 | import glob | 
- 参数 - pathname:文件名模式- 接受shell常用文件名模式语法- ?:单个字符
- *:任意字符
- []:字符选集
 
- .开头路径不被以上- ?、- *匹配
 
- 接受shell常用文件名模式语法
- recursive- False:默认
- True:- **将递归匹配所有子目录、文件
 
 
- 返回值:匹配文件名列表 - 目录前缀层次同参数
 
glob.glob是利用glob.fnmatch模块匹配名称模式
struct模块
struct模块:用于打包、解压二进制数据的调用
- 类似于C语言中struct声明,需要指定二进制中数据类型
- 可以使用任何一种字节序(大、小端)进行组合、分解
| 1 | import struct | 
shutil模块
shutil模块:包含文件操作相关
todo
系统、信息
locale模块
| 1 | import locale | 
dis模块
| 1 | def dis.dis(func) | 
atexit模块
atexit:主要用于在程序结束前执行代码
- 类似于析构,主要做资源清理工作
atexit.register
| 1 | def register( | 
- 用途:注册回调函数- 在程序退出之前,按照注册顺序反向调用已注册回调函数
- 如果程序非正常crash、通过os._exit()退出,注册回调 函数不会被调用
 
| 1 | import atexit | 
实现
atexit内部是通过sys.exitfunc实现的
- 将注册函数放到列表中,当程序退出时按照先进后出方式 调用注册的回调函数, 
- 若回调函数执行过程中抛出异常, - atexit捕获异常然后继续 执行之后回调函数,知道所有回调函数执行完毕再抛出异常
- 二者同时使用,通过 - atexit.register注册回调函数可能不会 被正常调用
signal模块
信号模块