前言

  • sys模块提供了一些变量和函数。这些变量可能被解释器使用,也可能由解释器提供。这些函数会影响解释器.
  • 文档地址
  • 这篇文章给常用的一些变量做笔记

sys.argv

一个列表,其中包含了被传递给 Python 脚本的命令行参数

  • argv[0]为脚本的名称(是否是完整的路径名取决于操作系统)。如果是通过Python解释器的命令行参数-c来执行的, argv[0]会被设置成字符串 '-c' 。如果没有脚本名被传递给Python解释器, argv[0]为空字符串。
  • 其他选项存在后续下标中,如python main.py -a -bargv[1]-a

为了遍历标准输入,或者通过命令行传递的文件列表,参照fileinput模块

sys.exec_prefix

  • 一个字符串,提供特定域的目录前缀,该目录中安装了与平台相关的 Python 文件,默认也是'/usr/local'
  • 该目录前缀可以在构建时使用configure脚本的--exec-prefix参数进行设置。
  • 具体而言,所有配置文件(如 pyconfig.h 头文件)都安装在目录 exec_prefix/lib/pythonX.Y/config中,共享库模块安装在 exec_prefix/lib/pythonX.Y/lib-dynload中,其中 X.Y 是 Python 的版本号,如 3.2。

sys.base_exec_prefix

  • base_exec_prefix在python启动的时候且在site.py运行之前被设置,和exec_prefix有相同的值(当不使用虚拟环境时)
  • 如果使用了虚拟环境,prefixexec_prefix会被改变,用于指向虚拟环境
  • base_prefixbase_exec_prefix会保持指向安装在系统中的python

sys.base_prefix

  • base_prefix在python启动的时候且在site.py运行之前被设置,和prefix有相同的值(当不使用虚拟环境时)
  • 如果使用了虚拟环境,prefixexec_prefix会被改变,用于指向虚拟环境
  • base_prefixbase_exec_prefix会保持指向安装在系统中的python

sys.builtin_module_names

一个元组,包含了所有被编译进了python解释器的模块

sys.exc_info()

本函数返回一个(type, value, traceback)元组:

  • type是正在处理的异常类型(它是BaseException的子类)
  • value是异常实例(异常类型的实例)
  • traceback 是一个回溯对象,该对象封装了最初发生异常时的调用堆栈。

如果整个堆栈都没有正在处理的异常,则以上3个值均为None

返回的信息仅限于当前线程和当前堆栈帧。如果当前堆栈帧没有正在处理的异常,则信息将从下级被调用的堆栈帧或上级调用者等位置获取,依此类推,直到找到正在处理异常的堆栈帧为止。此处的“处理异常”指的是“执行 except 子句”。任何堆栈帧都只能访问当前正在处理的异常的信息。

sys.last_type, sys.last_value, sys.last_traceback

这些变量的含义与上述exc_info()返回值的含义相同, 它们并非总是有定义,仅当有异常未处理,且解释器打印了错误消息和堆栈回溯时,才会给它们赋值。它们的预期用途,是允许交互中的用户导入调试器模块,进行事后调试,而不必重新运行导致错误的命令

通常使用

1
2
import pdb
pdb.pm() 

进入事后调试器,详情请参阅 pdb 模块。

sys.float_info

一个namedtuple,包含了浮点数相关信息

属性 float.h 宏 说明
epsilon DBL_EPSILON 大于 1.0 的最小值和 1.0 之间的差,表示为浮点数。另请参阅 math.ulp()。
dig DBL_DIG 浮点数可以真实表示的最大十进制数字;见下文
mant_dig DBL_MANT_DIG 浮点数精度:radix 基数下的浮点数有效位数
max DBL_MAX 可表示的最大正浮点数(非无穷)
max_exp DBL_MAX_EXP 使得 radix**(e-1) 是可表示的浮点数(非无穷)的最大整数 e
max_10_exp DBL_MAX_10_EXP 使得 10**e 在可表示的浮点数(非无穷)范围内的最大整数 e
min DBL_MIN 可表示的最小正规格化浮点数,使用 math.ulp(0.0) 获取可表示的最小正非规格化 浮点数
min_exp DBL_MIN_EXP 使得 radix**(e-1) 是规格化浮点数的最小整数 e
min_10_exp DBL_MIN_10_EXP 使得 10**e 是规格化浮点数的最小整数 e
radix FLT_RADIX 指数表示法中采用的基数
rounds FLT_ROUNDS 整数常数,表示算术运算中的舍入方式。它反映了解释器启动时系统的 FLT_ROUNDS 宏的值。关于可能的值及其含义的说明,请参阅 C99 标准 5.2.4.2.2 节。

sys.modules

一个字典,将模块名称映射到所有已加载的模块(使得我们可以通过名字访问模块)。可以操作该字典来强制重新加载模块,或是实现其他技巧。但是,替换的字典不一定会按预期工作,并且从字典中删除必要的项目可能会导致Python崩溃。

sys.path

  • 一个由字符串组成的列表,用于指定模块的搜索路径。初始化自环境变量PYTHONPATH,再加上一条与安装有关的默认路径。

  • 程序启动时将初始化本列表,列表的第一项path[0]目录含有调用Python解释器的脚本。如果脚本目录不可用(比如以交互方式调用了解释器,或脚本是从标准输入中读取的),则path[0]空字符串,这将导致Python优先搜索当前目录中的模块。注意,脚本目录将插入在PYTHONPATH的条目之前

  • 程序可以随意修改本列表用于自己的目的。只能向sys.path中添加stringbytes类型,其他数据类型将在导入期间被忽略。

参见site模块 ,该模块描述了如何使用.pth文件来扩展sys.path

sys.platform

本字符串是一个平台标识符,举例而言,该标识符可用于将特定平台的组件追加到 sys.path 中。

对于 Unix 系统(除 Linux 和 AIX 外),该字符串是 Python 构建时的uname -s返回的小写操作系统名称,并附加了uname -r 返回的系统版本的第一部分,如'sunos5''freebsd8'。除非需要检测特定版本的系统,否则建议使用以下习惯用法:

1
2
3
4
5
6
if sys.platform.startswith('freebsd'):
    # FreeBSD-specific code here...
elif sys.platform.startswith('linux'):
    # Linux-specific code here...
elif sys.platform.startswith('aix'):
    # AIX-specific code here...

此外,os.name更加简略, os.uname()提供系统的版本信息, platform模块提供了对系统标识更详细的检查。

sys.stdin, sys.stdout, sys.stderr

解释器用于标准输入、标准输出和标准错误的文件对象:

  • stdin用于所有交互式输入(包括对 input() 的调用);
  • stdout用于print()expression语句的输出,以及用于input()的提示符;
  • 解释器自身的提示符和它的错误消息都发往stderr

这些流都是常规文本文件,与open()函数返回的对象一致。它们的参数选择如下:

  • 字符编码取决于各个平台。在非 Windows 平台上使用的是语言环境 (locale) 编码(可参阅 locale.getpreferredencoding() )。

  • 在 Windows 上,控制台设备使用 UTF-8 编码。非字符设备(如磁盘文件和管道)使用系统语言环境编码(即 ANSI 代码页)。非控制台字符设备(即 isatty() 返回的是 True,如 NUL)在启动时,会把控制台输入代码页和输出代码页的值分别用于 stdin 和 stdout/stderr。如果进程原本没有附加到控制台,则默认为系统语言环境编码。

  • 要重写控制台的特殊行为,可以在启动 Python 前设置PYTHONLEGACYWINDOWSSTDIO 环境变量。此时,控制台代码页将用于其他字符设备。

  • 在所有平台上,都可以通过在 Python 启动前设置PYTHONIOENCODING环境变量来重写字符编码,或通过新的-X utf8命令行选项和PYTHONUTF8环境变量来设置。但是,对 Windows 控制台来说,上述方法仅在设置了PYTHONLEGACYWINDOWSSTDIO后才起效。

  • 交互模式下,stdout 流是行缓冲的。其他情况下,它像常规文本文件一样是块缓冲的。两种情况下的stderr流都是行缓冲的。要使得两个流都变成无缓冲,可以传入 -u 命令行选项或设置PYTHONUNBUFFERED 环境变量。

在 3.9 版更改: 非交互模式下,stderr现在是行缓冲的,而不是全缓冲的。

注解:
要从标准流写入或读取二进制数据,请使用底层二进制buffer对象。例如,要将字节写入stdout,请使用sys.stdout.buffer.write(b'abc')。 但是,如果你在写一个库(并且不限制执行库代码时的上下文),那么请注意,标准流可能会被替换为文件类对象,如 io.StringIO,它们是不支持 buffer 属性的。

sys.__stdin__, sys.__stdout__, sys.__stderr__

程序开始时,这些对象存有stdinstderrstdout的初始值。它们在程序结束前都可以使用,且在需要向实际的标准流打印内容时很有用.(即主要用来恢复标准输入、输出、错误流)

注解 某些情况下的stdinstdoutstderr以及初始值__stdin____stdout____stderr__可以是None。通常发生在未连接到控制台的 Windows GUI app 中,以及在用pythonw启动的 Python app 中。

sys.thread_info

一个namedtuple,包含线程实现的信息。

属性 说明
name 线程实现的名称:‘nt’: Windows 线程, ‘pthread’: POSIX 线程, ‘solaris’: Solaris 线程
lock 锁实现的名称:‘semaphore’: 锁使用信号量, ‘mutex+cond’: 锁使用互斥和条件变量, None 如果此信息未知
version 线程库的名称和版本。它是一个字符串,如果此信息未知,则为 None 。