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操作相关的基类