# 29.1. `sys` — 与系统相关的参数和函数

本模块提供了访问由解释器使用和维护的一些变量和与解释器强烈交互的函数。它始终可用。

`sys.``abiflags`

  在使用标准`configure`脚本构建Python的POSIX系统上，它包含由 PEP 3149指定的ABI标志。

  版本3.2中的新功能。

`sys.``argv`

  传递给Python脚本的命令行参数列表。`argv[0]`是脚本名称（与操作系统有关，无论这是否是完整的路径名）。If the command was executed using the `-c` command line option to the interpreter, `argv[0]` is set to the string `'-c'`. If no script name was passed to the Python interpreter, `argv[0]` is the empty string.

  要循环访问标准输入或命令行上给出的文件列表，请参阅`fileinput`模块。

`sys.``base_exec_prefix`

  在Python启动过程中，在`site.py`运行之前设置为与`exec_prefix`相同的值。如果不在virtual environment中运行，则值将保持不变；如果`site.py`发现虚拟环境正在使用，则`prefix`和`exec_prefix`的值将更改为指向虚拟环境，而`base_prefix`和`base_exec_prefix`将保持指向基本Python安装（虚拟环境的创建源）。

  版本3.3中的新功能。

`sys.``base_prefix`

  在Python启动过程中，在`site.py`运行之前设置为与`prefix`相同的值。如果不在virtual environment中运行，则值将保持不变；如果`site.py`发现虚拟环境正在使用，则`prefix`和`exec_prefix`的值将更改为指向虚拟环境，而`base_prefix`和`base_exec_prefix`将保持指向基本Python安装（虚拟环境的创建源）。

  版本3.3中的新功能。

`sys.``byteorder`

  本地字节顺序的指示符。这将在big-endian（最重要的字节在前）平台上具有值`'big'`，而在little-endian（最低有效字节在先）上具有`'little'`平台。

`sys.``builtin_module_names`

  一个字符串元组，给出了编译到这个Python解释器中的所有模块的名称。（该信息不能以其他方式提供 - `modules.keys()`仅列出导入的模块。）

`sys.``call_tracing`(func, args)

  在跟踪启用时调用`func(*args)`。跟踪状态被保存，并在之后恢复。这旨在从检查点的调试器调用，以递归调试其他代码。

`sys.``copyright`

  包含与Python解释器相关的版权的字符串。

`sys.``_clear_type_cache`()

  清除内部类型缓存。The type cache is used to speed up attribute and method lookups.Use the function only to drop unnecessary references during reference leak debugging.

  This function should be used for internal and specialized purposes only.

`sys.``_current_frames`()

  返回一个字典，该函数被调用时，将每个线程的标识符映射到当前在该线程中处于活动状态的最上面的堆栈帧。请注意，`traceback`模块中的函数可以构建给定这种帧的调用堆栈。

  这对于调试死锁非常有用：该函数不需要死锁线程的合作，只要这些线程的调用堆栈保持死锁状态，它们就会被冻结。在调用代码检查帧时，为非死锁线程返回的帧可能与该线程的当前活动无关。

  This function should be used for internal and specialized purposes only.

`sys.``_debugmallocstats`()

  打印低级别信息以了解CPython内存分配器的状态。

  如果Python配置了-with-pydebug，它还会执行一些昂贵的内部一致性检查。

  版本3.3中的新功能。

  CPython implementation detail: This function is specific to CPython. 确切的输出格式在这里没有定义，并且可能会改变。

`sys.``dllhandle`

  整数指定Python DLL的句柄。可用性：Windows。

`sys.``displayhook`(value)

  如果值不是`None`，则此函数将`repr(value)`打印到`sys.stdout`，并保存值在`builtins._`中。If `repr(value)` is not encodable to `sys.stdout.encoding` with `sys.stdout.errors` error handler (which is probably `'strict'`), encode it to `sys.stdout.encoding` with `'backslashreplace'` error handler.

  `sys.displayhook` is called on the result of evaluating an expression entered in an interactive Python session. 这些值的显示可以通过为`sys.displayhook`分配另一个参数来定制。

  伪代码：

      def displayhook(value):
          if value is None:
              return
          # Set '_' to None to avoid recursion
          builtins._ = None
          text = repr(value)
          try:
              sys.stdout.write(text)
          except UnicodeEncodeError:
              bytes = text.encode(sys.stdout.encoding, 'backslashreplace')
              if hasattr(sys.stdout, 'buffer'):
                  sys.stdout.buffer.write(bytes)
              else:
                  text = bytes.decode(sys.stdout.encoding, 'strict')
                  sys.stdout.write(text)
          sys.stdout.write("\n")
          builtins._ = value

  在版本3.2中更改：在`UnicodeEncodeError`上使用`'backslashreplace'`错误处理程序。

`sys.``dont_write_bytecode`

  如果这是真的，Python将不会尝试在导入源模块时编写`.pyc`文件。This value is initially set to `True` or `False` depending on the `-B` command line option and the `PYTHONDONTWRITEBYTECODE` environment variable, but you can set it yourself to control bytecode file generation.

`sys.``excepthook`(type, value, traceback)

  这个函数打印出一个给定的回溯和例外情况给`sys.stderr`。

  当引发异常并且未被捕获时，解释器使用三个参数调用`sys.excepthook`，异常类，异常实例和一个追踪对象。在交互式会话中，这恰好在控制返回提示之前发生；在一个Python程序中，这个就在程序退出之前发生。可以通过为`sys.excepthook`分配另一个三参数函数来自定义这些顶级异常的处理。

`sys.``__displayhook__`
`sys.``__excepthook__`

  这些对象在程序开始时包含`displayhook`和`excepthook`的原始值。它们被保存起来，以便在发生被破坏的对象替换时，可以恢复`displayhook`和`excepthook`。

`sys.``exc_info`()

  这个函数返回一个包含三个值的元组，该元组提供有关当前正在处理的异常的信息。返回的信息既针对当前线程也针对当前堆栈帧。如果当前堆栈帧没有处理异常，则从调用堆栈帧或其调用者那里获取信息，直到找到处理异常的堆栈帧为止。这里，“处理异常”定义为“执行except子句”。对于任何堆栈帧，只能访问有关当前处理的异常的信息。

  如果堆栈中的任何位置没有异常处理，则返回包含三个`None`值的元组。否则，返回的值是`（type， value， traceback）`。Their meaning is: type gets the type of the exception being handled (a subclass of `BaseException`); value gets the exception instance (an instance of the exception type); traceback gets a traceback object (see the Reference Manual) which encapsulates the call stack at the point where the exception originally occurred.

`sys.``exec_prefix`

  一个字符串，其中给出了特定于站点的目录前缀，其中安装了与平台相关的Python文件；默认情况下，这也是`'/usr/local'`。这可以在构建时使用configure脚本的`--exec-prefix`参数进行设置。具体而言，所有配置文件（例如 the `pyconfig.h` header file) are installed in the directory `exec_prefix/lib/pythonX.Y/config`, and shared library modules are installed in `exec_prefix/lib/pythonX.Y/lib-dynload`, where X.Y is the version number of Python, for example `3.2`.

  注意

  如果virtual environment有效，则此值将在`site.py`中更改为指向虚拟环境。通过`base_exec_prefix`，Python安装的值仍然可用。

`sys.``executable`

  一个字符串，给出Python解释器的可执行二进制文件的绝对路径，在这种情况下是合理的。If Python is unable to retrieve the real path to its executable, `sys.executable` will be an empty string or `None`.

`sys.``exit`([arg])

  从Python退出。这是通过引发`SystemExit`异常实现的，因此可以使用由`try`语句的finally子句指定的清理操作，并且可以在外层拦截退出尝试。

  可选参数arg可以是一个给出退出状态（默认为零）的整数或其他类型的对象。如果它是一个整数，零被认为是“成功终止”，并且任何非零值被shell等认为是“异常终止”。大多数系统要求它在0-127范围内，否则会产生未定义的结果。一些系统具有为特定退出代码分配特定含义的惯例，但这些通常是欠发达的； Unix程序通常使用2作为命令行语法错误，1使用其他类型的错误。如果传递另一种类型的对象，则`None`相当于传递零，并且任何其他对象都被打印到`stderr`并导致退出代码为1。特别是，`sys.exit（“some error message”）`是退出程序的快速方法发生错误。

  由于`exit()`最终“唯一”引发了一个异常，它只会在从主线程调用时退出进程，并且异常不会被拦截。

`sys.``flags`

  struct sequence flags暴露了命令行标志的状态。属性是只读的。

  属性 | 旗
  --- | ---
  `debug` | `-d`
  `inspect` | `-i`
  `interactive` | `-i`
  `optimize` | `-O`或`-OO`
  `dont_write_bytecode` | `-B`
  `no_user_site` | `-s`
  `no_site` | `-S`
  `ignore_environment` | `-E`
  `verbose` | `-v`
  `bytes_warning` | `-b`
  `quiet` | `-q`
  `hash_randomization` | `-R`

  在版本3.2中更改：为新的`-q`标志添加了`quiet`属性。

  版本3.2.3中的新功能： `hash_randomization`属性。

  在版本3.3中更改：删除了过时的`division_warning`属性。

`sys.``float_info`

  包含关于浮点类型信息的struct sequence。它包含有关精度和内部表示的低级信息。这些值对应于'C'编程语言的标准头文件`float.h`中定义的各种浮点常量；有关详细信息，请参见1999 ISO / IEC C标准[C99]，'浮点类型的特性'的5.2.4.2.2节。

  属性 | float.h宏 | 说明
  --- | --- | ---
  `epsilon` | DBL_EPSILON | 1和大于1的最小值之间的差值可以表示为浮点数
  `dig` | DBL_DIG | 浮点数可以忠实地表示的最大小数位数；见下文
  `mant_dig` | DBL_MANT_DIG | float precision：float的有效位数中的base- `radix`数字的个数
  `max` | DBL_MAX | 最大可表示的有限浮点数
  `max_exp` | DBL_MAX_EXP | maximum integer e such that `radix**(e-1)` is a representable finite float
  `max_10_exp` | DBL_MAX_10_EXP | maximum integer e such that `10**e` is in the range of representable finite floats
  `min` | DBL_MIN | 最小正归一化浮点数
  `min_exp` | DBL_MIN_EXP | 最小整数e使得`radix**(e-1)`是归一化的浮点数
  `min_10_exp` | DBL_MIN_10_EXP | 最小整数e使得`10**e`是标准化的浮点数
  `radix` | FLT_RADIX | 指数表示的基数
  `rounds` | FLT_ROUNDS | 整数常量表示用于算术运算的舍入模式。这反映了解释器启动时系统FLT_ROUNDS宏的价值。有关可能值及其含义的解释，请参阅C99标准的5.2.4.2.2节。

  属性`sys.float_info.dig`需要进一步说明。如果`s`是表示至多`sys.float_info.dig`有效数字的十进制数字的任何字符串，则将`s`转换为float并返回将恢复表示相同十进制值的字符串：

      >>> import sys
      >>> sys.float_info.dig
      15
      >>> s = '3.14159265358979'    # decimal string with 15 significant digits
      >>> format(float(s), '.15g')  # convert to float and back -> same value
      '3.14159265358979'

  但对于大于`sys.float_info.dig`有效数字的字符串，情况并非总是如此：

      >>> s = '9876543211234567'    # 16 significant digits is too many!
      >>> format(float(s), '.16g')  # conversion changes value
      '9876543211234568'

`sys.``float_repr_style`

  一个字符串，指示`repr()`函数如何为浮点操作。If the string has value `'short'` then for a finite float `x`, `repr(x)` aims to produce a short string with the property that `float(repr(x)) == x`. 这是Python 3.1和更高版本中的常见行为。Otherwise, `float_repr_style` has value `'legacy'` and `repr(x)` behaves in the same way as it did in versions of Python prior to 3.1.

  版本3.1中的新功能。

`sys.``getallocatedblocks`()

  不管大小如何，都返回当前由解释器分配的内存块数量。此功能主要用于跟踪和调试内存泄漏。由于解释器的内部缓存，结果可能因呼叫而异；您可能需要调用`_clear_type_cache()`和`gc.collect()`以获得更多可预测的结果。

  If a Python build or implementation cannot reasonably compute this information, `getallocatedblocks()` is allowed to return 0 instead.

  版本3.4中的新功能。

`sys.``getcheckinterval`()

  返回解释器的“检查间隔”；请参阅`setcheckinterval()`。

  从版本3.2开始弃用：改为使用`getswitchinterval()`。

`sys.``getdefaultencoding`()

  返回Unicode实现使用的当前默认字符串编码的名称。

`sys.``getdlopenflags`()

  返回用于`dlopen()`调用的标志的当前值。Symbolic names for the flag values can be found in the `os` module (`RTLD_xxx` constants, e.g. `os.RTLD_LAZY` 可用性：UNIX。

`sys.``getfilesystemencoding`()

  返回用于将Unicode文件名转换为系统文件名的编码名称。结果值取决于操作系统：

  - 在Mac OS X上，编码是`'utf-8'`。
  - 在Unix上，根据nl_langinfo（CODESET）的结果，编码是用户的偏好。
  - 在Windows NT +上，文件名本身是Unicode，因此不执行转换。`getfilesystemencoding()` still returns `'mbcs'`, as this is the encoding that applications should use when they explicitly want to convert Unicode strings to byte strings that are equivalent when used as file names.
  - 在Windows 9x上，编码是`'mbcs'`。

  在版本3.2中更改： `getfilesystemencoding()`结果不能再`None`。

`sys.``getrefcount`(object)

  返回对象的引用计数。返回的计数通常比您预期的要高，因为它包含（临时）引用作为`getrefcount()`的参数。

`sys.``getrecursionlimit`()

  返回递归限制的当前值，即Python解释器堆栈的最大深度。此限制可防止无限递归导致C堆栈溢出并导致Python崩溃。它可以由`setrecursionlimit()`设置。

`sys.``getsizeof`(object[, default])

  以字节为单位返回对象的大小。该对象可以是任何类型的对象。所有内置对象都会返回正确的结果，但这不一定适用于第三方扩展，因为它是特定于实现的。

  只考虑直接归因于该对象的内存消耗，而不考虑其引用的对象的内存消耗。

  如果给定，如果对象不提供检索大小的方法，则将返回默认。否则会引发`TypeError`。

  `getsizeof()`调用对象的`__sizeof__`方法，如果对象由垃圾收集器管理，则会添加额外的垃圾回收器开销。

  递归地使用`getsizeof()`的示例参见递归sizeof recipe以查找容器及其所有内容的大小。

`sys.``getswitchinterval`()

  返回解释器的“线程切换间隔”；请参阅`setswitchinterval()`。

  版本3.2中的新功能。

`sys.``_getframe`([depth])

  从调用堆栈中返回一个框架对象。如果给出了可选的整数depth，则将多个调用的帧对象返回到堆栈顶部以下。如果这比调用堆栈更深，则引发`ValueError`。depth的默认值为零，返回调用堆栈顶部的帧。

  CPython implementation detail: This function should be used for internal and specialized purposes only. 不能保证在Python的所有实现中都存在。

`sys.``getprofile`()

  Get the profiler function as set by `setprofile()`.

`sys.``gettrace`()

  获取由`settrace()`设置的跟踪函数。

  CPython实现细节 `gettrace()`函数仅用于实现调试器，分析器，覆盖工具等。它的行为是实现平台的一部分，而不是语言定义的一部分，因此可能不适用于所有Python实现。

`sys.``getwindowsversion`()

  返回描述当前正在运行的Windows版本的命名元组。The named elements are major, minor, build, platform, service_pack, service_pack_minor, service_pack_major, suite_mask, and product_type. service_pack包含一个字符串，而其他所有值都是整数。组件也可以按名称访问，所以`sys.getwindowsversion()[0]`等同于`sys.getwindowsversion().major`。为了与先前版本兼容，只有前5个元素可通过索引检索。

  平台可能是下列其中一个值：

  不变 | 平台
  --- | ---
  `0 （VER_PLATFORM_WIN32s）` | Windows 3.1上的Win32s
  `1 （VER_PLATFORM_WIN32_WINDOWS）` | Windows 95/98 / ME
  `2 （VER_PLATFORM_WIN32_NT）` | Windows NT / 2000 / XP / x64
  `3 （VER_PLATFORM_WIN32_CE）` | Windows CE

  product_type可能是以下值之一：

  不变 | 含义
  --- | ---
  `1 （VER_NT_WORKSTATION）` | 该系统是一个工作站。
  `2 （VER_NT_DOMAIN_CONTROLLER）` | 该系统是一个域控制器。
  `3 （VER_NT_SERVER）` | 该系统是一个服务器，但不是域控制器。

  此函数包装Win32 `GetVersionEx()`函数；有关这些字段的更多信息，请参阅`OSVERSIONINFOEX()`上的Microsoft文档。

  可用性：Windows。

  版本3.2中的变化：变成一个命名元组，并添加service_pack_minor、service_pack_major、 suite_mask和product_type。

`sys.``get_coroutine_wrapper`()

  返回`None`，或由`set_coroutine_wrapper()`设置的包装器。

  版本3.5中的新功能：了解更多详情，请参阅 PEP 492。

  注意

  此功能暂时添加（详情请参阅 PEP 411）。仅用于调试目的。

`sys.``hash_info`

  给出数字散列实现参数的struct sequence。有关数字类型散列的更多详细信息，请参阅Hashing of numeric types。

  属性 | 说明
  --- | ---
  `width` | 用于散列值的位宽
  `modulus` | 用于数字哈希方案的素数模数P.
  `inf` | 哈希值返回正无穷大
  `nan` | 哈希值返回一个南
  `imag` | 乘数用于复数的虚部
  `algorithm` | str，字节和内存视图散列算法的名称
  `hash_bits` | 哈希算法的内部输出大小
  `seed_bits` | 散列算法的种子密钥的大小

  版本3.2中的新功能。

  在版本3.4中改变：添加了算法，hash_bits和seed_bits

`sys.``hexversion`

  版本号编码为单个整数。每个版本都有保证，包括适当支持非生产版本。例如，要测试Python解释器的版本是否至少为1.5.2，请使用：

      if sys.hexversion >= 0x010502F0:
          # use some advanced feature
          ...
      else:
          # use an alternative implementation or warn the user
          ...

  这被称为`hexversion`，因为只有当它传递给内置的`hex()`函数时才会看起来很有意义。struct sequence `sys.version_info`可用于对相同信息进行更人性化的编码。

  在API and ABI Versioning中可以找到`hexversion`的更多详细信息。

`sys.``implementation`

  包含有关当前正在运行的Python解释器的实现信息的对象。所有Python实现中都需要以下属性。

  name是实现的标识符，例如`'cpython'`实际的字符串由Python实现定义，但保证为小写。

  version是一个命名元组，格式与`sys.version_info`相同。它代表Python 实现的版本。这与当前正在运行的解释器符合的特定版本的Python 语言有明确的含义，`sys.version_info`表示。For example, for PyPy 1.8 `sys.implementation.version` might be `sys.version_info(1, 8, 0, 'final', 0)`, whereas `sys.version_info` would be `sys.version_info(2, 7, 2, 'final', 0)`. 对于CPython，它们具有相同的价值，因为它是参考实现。

  hexversion是十六进制格式的实现版本，如`sys.hexversion`。

  cache_tag是导入机制在缓存模块的文件名中使用的标签。按照惯例，它将是实现名称和版本的组合，如`'cpython-33'`。但是，如果合适，Python实现可能会使用其他值。如果`cache_tag`设置为`None`，则表示应禁用模块缓存。

  `sys.implementation`可能包含特定于Python实现的其他属性。这些非标准属性必须以下划线开头，这里不再描述。Regardless of its contents, `sys.implementation` will not change during a run of the interpreter, nor between implementation versions. （然而，它可能会在Python语言版本之间改变。）有关更多信息，请参见 PEP 421。

  版本3.3中的新功能。

`sys.``int_info`

  一个struct sequence，它包含关于Python内部整数表示的信息。属性是只读的。

  属性 | 说明
  --- | ---
  `bits_per_digit` | 每位数字中保存的位数。Python整数存储在内部`2**int_info.bits_per_digit`
  `sizeof_digit` | 用于表示数字的C类型的字节大小

  版本3.1中的新功能。

`sys.``__interactivehook__`

  当该属性存在时，当解释器以interactive mode启动时，它的值会自动调用（不带参数）。这是在读取 `PYTHONSTARTUP`文件之后完成的，以便您可以在此处设置此钩子。`site`模块sets this。

  版本3.4中的新功能。

`sys.``intern`(string)

  在“interned”字符串表中输入字符串，并返回字符串 - 字符串本身或副本。实习字符串对于在字典查找中获得一些性能很有用 - 如果字典中的密钥被实施并且查找密钥被实施，则可以通过指针比较而不是字符串比较来完成关键比较（哈希后）。通常情况下，Python程序中使用的名称会自动实现，并且用于保存模块，类或实例属性的字典具有实际的密钥。

  Interned字符串不是不朽的；你必须保持对`intern()`的返回值的引用，才能从中受益。

`sys.``is_finalizing`()

  如果Python解释器shutting down，则返回`True`，否则返回`False`。

  版本3.5中的新功能。

`sys.``last_type`
`sys.``last_value`
`sys.``last_traceback`

  这三个变量并不总是被定义的；它们在未处理异常时设置，并且解释器打印错误消息和堆栈回溯。它们的预期用途是允许交互式用户导入调试器模块并进行事后调试，而不必重新执行导致错误的命令。(Typical use is `import pdb; pdb.pm()` to enter the post-mortem debugger; see `pdb` module for more information.)

  变量的含义与上面`exc_info()`中返回值的含义相同。

`sys.``maxsize`

  一个给出最大值的整数是一个`Py_ssize_t`类型的变量。在32位平台上通常是`2 ** 31 - 1`和`2 ** 63 - 1`在64位平台上。

`sys.``maxunicode`

  一个给出最大Unicode码点值的整数，即 `1114111`（`0x10FFFF`，十六进制）。

  Changed in version 3.3: Before PEP 393, `sys.maxunicode` used to be either `0xFFFF` or `0x10FFFF`, depending on the configuration option that specified whether Unicode characters were stored as UCS-2 or UCS-4.

`sys.``meta_path`

  调用其`find_spec()`方法的meta path finder对象的列表，以查看其中一个对象是否可以找到要导入的模块。至少调用正在导入的模块的绝对名称来调用`find_spec()`方法。如果要导入的模块包含在包中，则父包的`__path__`属性将作为第二个参数传入。如果找不到模块，该方法将返回module spec或`None`。

  也可以看看

  `importlib.abc.MetaPathFinder`
    抽象基类定义`meta_path`上的查找器对象的接口。
  `importlib.machinery.ModuleSpec`
    The concrete class which `find_spec()` should return instances of.

  版本3.4中改变： Module specs是在Python 3.4中由 PEP 451引入的。早期版本的Python寻找一种名为`find_module()`的方法。如果`meta_path`条目没有`find_spec()`方法，这仍然称为后备。

`sys.``modules`

  这是一个将模块名称映射到已经加载的模块的字典。这可以被操纵来强制重新加载模块和其他技巧。但是，替换字典并不一定按预期工作，并且从字典中删除基本项目可能会导致Python失败。

`sys.``path`

  指定模块搜索路径的字符串列表。从环境变量 `PYTHONPATH`初始化，加上依赖于安装的缺省值。

  正如在程序启动时初始化的那样，这个列表的第一个项目`path[0]`是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用（例如，如果解释器是交互式调用的，或者脚本是从标准输入读取的），那么`path[0]`是空字符串，它指示Python首先在当前目录中搜索模块。请注意，由于 `PYTHONPATH`插入的条目之前，脚本目录被插入中。

  一个程序可以根据自己的目的自由修改这个列表。只有字符串和字节应该添加到`sys.path`；导入时忽略所有其他数据类型。

  也可以看看

  模块`site`这描述了如何使用.pth文件来扩展`sys.path`。

`sys.``path_hooks`

  可以使用路径参数尝试为路径创建finder的可调用列表。如果可以创建查找器，它将由可调用对象返回，否则引发`ImportError`。

  最初在 PEP 302中指定。

`sys.``path_importer_cache`

  作为finder对象缓存的字典。键是已经传递给`sys.path_hooks`的路径，值是找到的查找器。如果一个路径是一个有效的文件系统路径，但是在`sys.path_hooks`上没有找到finder，则存储`None`。

  最初在 PEP 302中指定。

  Changed in version 3.3: `None` is stored instead of `imp.NullImporter` when no finder is found.

`sys.``platform`

  例如，该字符串包含一个平台标识符，可用于将特定于平台的组件附加到`sys.path`。

  For Unix systems, except on Linux, this is the lowercased OS name as returned by `uname -s` with the first part of the version as returned by `uname -r` appended, e.g. `'sunos5'`或`'freebsd8'`，在构建Python时。除非您想测试特定的系统版本，否则建议使用以下习惯用法：

      if sys.platform.startswith('freebsd'):
          # FreeBSD-specific code here...
      elif sys.platform.startswith('linux'):
          # Linux-specific code here...

  对于其他系统，其值为：

  系统 | `platform`值
  --- | ---
  Linux的 | `'linux'`
  视窗 | `'win32'`
  在Windows / Cygwin的 | `'cygwin'`
  Mac OS X | `'darwin'`

  在版本3.3中更改：在Linux上，`sys.platform`不再包含主要版本。它始终是`'linux'`，而不是`'linux2'`或`'linux3'`。由于较早的Python版本包含版本号，因此建议始终使用上面提供的`startswith`成语。

  也可以看看

  `os.name`具有较粗的粒度。`os.uname()`给出系统相关的版本信息。

  `platform`模块提供了有关系统身份的详细检查。

`sys.``prefix`

  一个字符串，它给出了特定于站点的目录前缀，其中安装了与平台无关的Python文件；默认情况下，这是字符串`'/usr/local'`。这可以在构建时使用configure脚本的`--prefix`参数进行设置。The main collection of Python library modules is installed in the directory `prefix/lib/pythonX.Y` while the platform independent header files (all except `pyconfig.h`) are stored in `prefix/include/pythonX.Y`, where X.Y is the version number of Python, for example `3.2`.

  注意

  如果virtual environment有效，则此值将在`site.py`中更改为指向虚拟环境。通过`base_prefix`，Python安装的值仍然可用。

`sys.``ps1`
`sys.``ps2`

  指定解释器的主要和次要提示的字符串。这些仅在解释器处于交互模式时才被定义。它们的初始值在这种情况下是`'＆gt；＆gt；＆gt； '`和`'... t4 > '`。如果非字符串对象被分配给任何一个变量，则每次解释器准备读取新的交互式命令时，都会重新评估它的`str()`；这可以用来实现动态提示。

`sys.``setcheckinterval`(interval)

  设置解释器的“检查间隔”。此整数值决定解释器检查周期性事件的频率，例如线程切换和信号处理程序。缺省值是`100`，这意味着检查每100个Python虚拟指令执行一次。将其设置为更大的值可能会增加使用线程的程序的性能。将其设置为值`<=` 0会检查每条虚拟指令，从而最大限度地提高响应性和开销。

  从版本3.2开始弃用：由于线程切换和异步任务的内部逻辑已被重写，此函数不再有效果。改为使用`setswitchinterval()`。

`sys.``setdlopenflags`(n)

  设置解释器用于`dlopen()`调用的标志，例如当解释器加载扩展模块时。除此之外，如果调用`sys.setdlopenflags(0)`，这将在导入模块时启用对符号的惰性解析。要通过扩展模块共享符号，请调用`sys.setdlopenflags(os.RTLD_GLOBAL)`。Symbolic names for the flag values can be found in the `os` module (`RTLD_xxx` constants, e.g. `os.RTLD_LAZY`

  可用性：UNIX。

`sys.``setprofile`(profilefunc)

  设置系统的配置文件功能，它允许您在Py​​thon中实现Python源代码分析器。有关Python分析器的更多信息，请参阅The Python Profilers一章。系统的配置文件函数与系统的跟踪函数类似（参见`settrace()`），但不会为每个已执行的代码行调用（仅在调用和返回时调用，但返回事件是即使在设定例外情况下也会报告）。该函数是线程特定的，但探查器没有办法知道线程之间的上下文切换，所以在多线程的情况下使用它是没有意义的。而且，它的返回值没有使用，所以它可以简单地返回`None`。

`sys.``setrecursionlimit`(limit)

  将Python解释器堆栈的最大深度设置为limit。此限制可防止无限递归导致C堆栈溢出并导致Python崩溃。

  尽可能高的限制取决于平台。当用户需要深度递归的程序和支持更高限制的平台时，用户可能需要设置更高的限制。这应该谨慎处理，因为太高的限制可能会导致崩溃。

  如果当前递归深度的新限制过低，则会引发`RecursionError`异常。

  在版本3.5.1中更改：如果当前递归深度的新限制太低，现在会引发`RecursionError`异常。

`sys.``setswitchinterval`(interval)

  设置解释器的线程切换间隔（以秒为单位）。这个浮点值决定了分配给并发运行的Python线程的“时间片”的理想持续时间。请注意，实际值可能更高，特别是如果使用长时间运行的内部函数或方法。另外，在时间间隔结束时哪个线程将被调度，这是操作系统的决定。解释器没有自己的调度器。

  版本3.2中的新功能。

`sys.``settrace`(tracefunc)

  设置系统的跟踪功能，它允许你在Python中实现一个Python源代码调试器。该函数是特定于线程的；为了支持多线程的调试器，必须使用`settrace()`注册正在调试的每个线程。

  跟踪函数应该有三个参数：frame，event和arg。frame是当前的堆栈帧。事件是一个字符串：`'call'`，`'line'`，`'return'`，`'exception'`，`'c_call'`，`'c_return'`或`'c_exception'`。arg取决于事件类型。

  无论何时输入新的本地作用域，都会调用跟踪函数（将event设置为`'call'`）；它应该返回一个本地跟踪函数的引用来使用该范围，或者如果不应该跟踪范围，则返回`None`。

  局部跟踪函数应该返回一个对自身的引用（或者在该范围内进一步跟踪的另一个函数），或者`None`关闭该范围内的跟踪。

  这些事件具有以下含义：

  `'call'`
    一个函数被调用（或其他一些代码块输入）。全局跟踪功能被调用； arg是`None`；返回值指定本地跟踪功能。
  `'line'`
    解释器即将执行一行新的代码或重新执行循环的条件。局部跟踪功能被调用； arg是`None`；返回值指定新的本地跟踪功能。请参阅`Objects/lnotab_notes.txt`了解其工作原理的详细说明。
  `'return'`
    函数（或其他代码块）即将返回。局部跟踪功能被调用； 如果事件是由引发的异常引起的，则arg是将返回的值，或`None`。跟踪函数的返回值被忽略。
  `'exception'`
    发生异常。局部跟踪功能被调用； arg是元组`（异常， 值， 回溯）`返回值指定新的本地跟踪功能。
  `'c_call'`
    C函数即将被调用。这可能是一个扩展功能或内置。arg是C函数对象。
  `'c_return'`
    一个C函数已经返回。arg是C函数对象。
  `'c_exception'`
    C函数引发了一个异常。arg是C函数对象。

  请注意，随着异常传播到调用者链中，每个级别都会生成一个`'exception'`事件。

  有关代码和框架对象的详细信息，请参阅The standard type hierarchy。

  CPython实现细节 `settrace()`函数仅用于实现调试器，分析器，覆盖工具等。它的行为是实现平台的一部分，而不是语言定义的一部分，因此可能不适用于所有Python实现。

`sys.``settscdump`(on_flag)

  如果on_flag为真，则使用Pentium时间戳计数器激活VM测量结果的转储。如果on_flag关闭，则停用这些转储。该功能仅在Python编译时使用`--with-tsc`才可用。要理解此转储的输出，请阅读Python源代码中的`Python/ceval.c`。

  CPython implementation detail: This function is intimately bound to CPython implementation details and thus not likely to be implemented elsewhere.

`sys.``set_coroutine_wrapper`(wrapper)

  Allows intercepting creation of coroutine objects (only ones that are created by an `async def` function; generators decorated with `types.coroutine()` or `asyncio.coroutine()` will not be intercepted).

  包装参数必须是：

  - 一个可接受一个参数的调用（一个协程对象）；
  - `None`，重置包装。

  如果调用两次，则新包装将替换前一个。该函数是特定于线程的。

  wrapper可调用不能直接或间接定义新的协程：

      def wrapper(coro):
          async def wrap(coro):
              return await coro
          return wrap(coro)
      sys.set_coroutine_wrapper(wrapper)

      async def foo():
          pass

      # The following line will fail with a RuntimeError, because
      # ``wrapper`` creates a ``wrap(coro)`` coroutine:
      foo()

  另见`get_coroutine_wrapper()`。

  版本3.5中的新功能：了解更多详情，请参阅 PEP 492。

  注意

  此功能暂时添加（详情请参阅 PEP 411）。仅用于调试目的。

`sys.``stdin`
`sys.``stdout`
`sys.``stderr`

  解释器用于标准输入，输出和错误的File objects：

  - `stdin`用于所有交互式输入（包括对`input()`的调用）；
  - `stdout`用于`print()`和expression语句的输出以及`input()`的提示。
  - 解释器自己的提示和错误消息转到`stderr`。

  这些流是`open()`函数返回的常规text files。他们的参数选择如下：

  - 字符编码是平台相关的。在Windows下，如果流是交互式的（也就是说，如果它的`isatty()`方法返回`True`），则使用控制台代码页，否则使用ANSI代码页。在其他平台下，使用区域设置编码（请参阅`locale.getpreferredencoding()`）。

    但是，在所有平台下，您可以在启动Python之前通过设置 `PYTHONIOENCODING`环境变量来覆盖此值。

  - 交互时，标准流是行缓冲的。否则，它们像常规文本文件一样被块缓冲。您可以使用`-u`命令行选项覆盖此值。

  注意

  要向标准流写入或读取二进制数据，请使用基础二进制`buffer`对象。例如，要将字节写入`stdout`，请使用`sys.stdout.buffer.write(b'abc')`。

  但是，如果您正在编写一个库（并且不控制其代码将在哪个上下文中执行），请注意，标准流可能会替换为类似文件的对象，如`io.StringIO`不支持`buffer`属性。

`sys.``__stdin__`
`sys.``__stdout__`
`sys.``__stderr__`

  这些对象在程序开始时包含`stdin`，`stderr`和`stdout`的原始值。它们在定稿过程中使用，无论`sys.std*`对象是否被重定向，都可以用于打印到实际的标准流。

  它也可用于将实际文件恢复到已知工作文件对象，以防被已损坏的对象覆盖。但是，执行此操作的首选方法是在替换之前显式保存前一个流，然后恢复保存的对象。

  注意

  Under some conditions `stdin`, `stdout` and `stderr` as well as the original values `__stdin__`, `__stdout__` and `__stderr__` can be None. 对于未连接到控制台的Windows GUI应用程序以及以pythonw开头的Python应用程序，通常情况如此。

`sys.``thread_info`

  包含关于线程实现的信息的struct sequence。

  属性 | 说明
  --- | ---
  `name` | 线程实现的名称： `'nt'`: Windows threads `'pthread'`: POSIX threads `'solaris'`: Solaris threads
  `lock` | 锁执行的名称： `'semaphore'`: a lock uses a semaphore `'mutex+cond'`: a lock uses a mutex and a condition variable `None` if this information is unknown
  `version` | 线程库的名称和版本。它是一个字符串，或者`None`，如果这些信息是未知的。

  版本3.3中的新功能。

`sys.``tracebacklimit`

  当此变量设置为整数值时，它确定发生未处理的异常时打印的追溯信息的最大级别数。默认值是`1000`。当设置为`0`或更低时，所有回溯信息被抑制，并且只打印异常类型和值。

`sys.``version`

  一个字符串，其中包含Python解释器的版本号以及所使用的内部版本号和编译器的附加信息。交互式解释器启动时显示该字符串。不要将版本信息提取出来，而应使用`version_info`和`platform`模块提供的功能。

`sys.``api_version`

  此解释器的C API版本。在调试Python和扩展模块之间的版本冲突时，程序员可能会觉得这很有用。

`sys.``version_info`

  一个包含版本号五个组成部分的元组：major、minor、micro、releaselevel和serial。除releaselevel以外的所有值均为整数；发布级别是`'alpha'`，`'beta'`，`'candidate'`或`'final'`。The `version_info` value corresponding to the Python version 2.0 is `(2, 0, 0, 'final', 0)`. 组件也可以通过名称访问，所以`sys.version_info[0]`等同于`sys.version_info.major`等等。

  在版本3.1中更改：添加了命名的组件属性。

`sys.``warnoptions`

  这是警告框架的实施细节；不要修改这个值。有关警告框架的更多信息，请参阅`warnings`模块。

`sys.``winver`

  用于在Windows平台上形成注册表项的版本号。这将作为字符串资源1000存储在Python DLL中。该值通常是`version`的前三个字符。它在`sys`模块中用于提供信息；修改此值不会影响Python使用的注册表项。可用性：Windows。

`sys.``_xoptions`

  通过`-X`命令行选项传递的各种实现特定标志的字典。如果显式给出选项名称或将其映射到它们的值，或者将它们映射到`True`。例：

      $ ./python -Xa=b -Xc
      Python 3.2a3+ (py3k, Oct 16 2010, 20:14:50)
      [GCC 4.4.3] on linux2
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import sys
      >>> sys._xoptions
      {'a': 'b', 'c': True}

  CPython implementation detail: This is a CPython-specific way of accessing options passed through `-X`. 其他实现可以通过其他方式导出它们，或根本不导入它们。

  版本3.2中的新功能。

引文

[C99] | ISO/IEC 9899:1999. “编程语言-C”这个标准的公共草案可以在http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf上找到。