6.1 配置状态
在执行 Python 代码之前,CPython 首先会对运行时及用户选项进行配置。
运行时的配置存位于三个位置,数据结构在 PEP 587 中定义:
PyPreConfig,用于预初始化配置;
PyConfig,用于运行时配置;
CPython 解释器编译选项的配置。
PyPreConfig
和PyConfig
数据结构都定义在 Include/cpython/initconfig.h
文件中。
预初始化配置
预初始化配置与运行时配置是分开的,因为它的属性与操作系统或用户环境相关。
PyPreConfig
有三个主要功能:
设置 Python 内存分配器;
配置
LC_CTYPE
语言环境;将 LC_CTYPE 区域配置为系统或用户首选的区域配置;
设置 UTF-8 模式(PEP 540)。
PyPreConfig
结构体包含以下属性,都是 int
类型:
allocator:选择一个内存分配器,如:
PYMEM_ALLOCATOR_MALLOC
。运行./configure --help
可获取有关内存分配器的详细信息;configure_locale:将
LC_CTYPE
区域设置为用户首选的区域配置。如果等于 0,则将coerce_c_locale
和coerce_c_locale_warn
设置为 0;coerce_c_locale:如果等于 2,则强制使用 C 语言区域配置; 如果等于 1,则读取
LC_CTYPE
的区域设置来决定是否强制使用 C 语言区域配置;coerce_c_locale_warn:如果非零,在强制使用 C 语言区域配置时会发出告警;
dev_mode:开启开发模式;
isolated:启用隔离模式:
sys.path
不包含脚本的目录,也不包含用户的 site-packages 目录;legacy_windows_fs_encoding:(只在 windows 下使用)如果非零禁用 UTF-8 模式并设置 Python 文件系统编码模式为
mbcs
;parse_argv:如果非零,则使用命令行参数;
use_environment:如果大于零,则使用环境变量;
utf8_mode:如果非零,则启用 UTF-8 模式。
相关的源文件
以下是与 PyPreConfig
相关的源文件:
运行时配置数据结构
第二阶段配置是运行时配置。PyConfig 中的运行时配置数据结构包含一些值:
调试和优化等模式的运行时标志;
执行模式,如:脚本文件,标准输入或者一个模块;
扩展选项,通过
-X <选项值>
的方式来指定;运行时设置的环境变量。
CPython 运行时使用配置数据来启用和禁用某项功能。
通过命令行设置运行时配置
Python 还附带了几个命令行接口选项。 如,CPython 有个名为 verbose 的模式,这个模式主要面向开发者,用于调试 CPython。
你可以通过 -v
标志启用 verbose 模式,当模块被加载时,Python 会将信息打印在屏幕上:
可以看到在屏幕上会打印出上百条甚至更多的模块加载信息,包含用户 site-packages 和其他在系统环境中的模块。 由于运行时配置可以通过多种方式进行设置,因此各个配置设置之间是有优先顺序的。verbose 模式的优先顺序如下:
config->verbose
的默认值是 -1,硬编码在源码中;环境变量 PYTHONVERBOSE 用来设置
config->verbose
的值;如果环境变量不存在,将会保留默认值 -1;
在 Python/initconfig.c 文件的 config_parse_cmdline() 方法中,如果有提供命令行标志的话也会被用来设置值;
该值将会被 _Py_GetGlobalVariablesAsDict() 方法拷贝到一个全局变量
Py_VerboseFlag
中。
所有的 PyConfig
值都遵循相同的排列和优先顺序:
查看运行时配置
CPython 解释器有一组运行时标志,这些标志是用于切换 CPython 相关行为的高级功能。 在 Python 会话中,你可以使用 sys.flags
命名元组访问运行时标志,例如 verbose 模式和 quiet 模式。所有通过 -X
指定的标志都会存储在 sys._xoptions
字典中:
Last updated