Python 运行时服务
sys
sys:与Python解释器本身相关的组件
平台、版本
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
sysconfig
builtins
__main__
warnings
dataclass
atexit
atexit:主要用于在程序结束前执行代码
- 类似于析构,主要做资源清理工作
 
atexit.register
1  | def register(  | 
- 用途:注册回调函数
- 在程序退出之前,按照注册顺序反向调用已注册回调函数
 - 如果程序非正常crash、通过
os._exit()退出,注册回调 函数不会被调用 
 
1  | import atexit  | 
实现
atexit内部是通过sys.exitfunc实现的
将注册函数放到列表中,当程序退出时按照先进后出方式 调用注册的回调函数,
若回调函数执行过程中抛出异常,
atexit捕获异常然后继续 执行之后回调函数,知道所有回调函数执行完毕再抛出异常二者同时使用,通过
atexit.register注册回调函数可能不会 被正常调用
traceback
traceback.print_tb
1  | import traceback, sys  | 
__future__
gc
inspect
site
abc
ABCMeta
1  | from abc import ABCMeta, abstractmethod  | 
用途
标准库中有很多用到抽象基类的地方
collections模块定义了很多和容器、迭代器(序列、映射、 集合)有关的抽象基类1
2
3
4
5
6import collections as clt
clt.Sequence
clt.Iterable
clt.Sized
clt.Mappingnumbers库定义了跟数据对象:整数、浮点数、有理数有关的 基类IO库定义了很多跟IO操作相关的基类

