python初始化配置

3.8 新版功能.

可以使用以下命令初始化Python Py_InitializeFromConfig() 以及 PyConfig 结构。可以使用以下命令对其进行预初始化 Py_PreInitialize() 以及 PyPreConfig 结构。

有两种配置:

  • 这个 Python Configuration 可用于构建行为类似于常规Python的自定义Python。例如,环境变量和命令行参数用于配置Python。

  • 这个 Isolated Configuration 可用于将Python嵌入到应用程序中。它将Python与系统隔离开来。例如,环境变量被忽略,LC_CTYPE区域设置保持不变,并且没有注册信号处理程序。

这个 Py_RunMain() 函数可以用来编写定制的Python程序。

也见 Initialization, Finalization, and Threads .

参见

PEP 587 “python初始化配置”。

示例

自定义python始终以隔离模式运行的示例:

int main(int argc, char **argv)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);
    config.isolated = 1;

    /* Decode command line arguments.
       Implicitly preinitialize Python (in isolated mode). */
    status = PyConfig_SetBytesArgv(&config, argc, argv);
    if (PyStatus_Exception(status)) {
        goto exception;
    }

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) {
        goto exception;
    }
    PyConfig_Clear(&config);

    return Py_RunMain();

exception:
    PyConfig_Clear(&config);
    if (PyStatus_IsExit(status)) {
        return status.exitcode;
    }
    /* Display the error message and exit the process with
       non-zero exit code */
    Py_ExitStatusException(status);
}

PyWideStringList

type PyWideStringList

名单 wchar_t* 串。

如果 长度 非零, 项目 必须是非-``空',所有字符串都必须是非-``空'。

方法:

PyStatus PyWideStringList_Append(PyWideStringList *list, const wchar_t *item)

追加 itemlist .

必须预先初始化python才能调用此函数。

PyStatus PyWideStringList_Insert(PyWideStringList *list, Py_ssize_t index, const wchar_t *item)

插入 item 进入之内 list指数 .

如果 指数 大于或等于 list 长度,附加 itemlist .

指数 必须大于或等于0。

必须预先初始化python才能调用此函数。

结构字段:

Py_ssize_t length

列表长度。

wchar_t **items

列出项目。

PyStatus

type PyStatus

存储初始化函数状态的结构:成功、错误或退出。

对于错误,它可以存储创建错误的C函数名。

结构字段:

int exitcode

退出代码。参数传递给 exit() .

const char *err_msg

错误消息。

const char *func

创建错误的函数的名称,可以是 NULL .

创建状态的函数:

PyStatus PyStatus_Ok(void)

成功。

PyStatus PyStatus_Error(const char *err_msg)

初始化错误,并显示一条消息。

err_msg 一定不能是 NULL

PyStatus PyStatus_NoMemory(void)

内存分配失败(内存不足)。

PyStatus PyStatus_Exit(int exitcode)

使用指定的退出代码退出python。

处理状态的函数:

int PyStatus_Exception(PyStatus status)

状态是错误还是退出?如果为真,则必须处理异常;通过调用 Py_ExitStatusException() 例如。

int PyStatus_IsError(PyStatus status)

结果是错误吗?

int PyStatus_IsExit(PyStatus status)

结果是退出吗?

void Py_ExitStatusException(PyStatus status)

呼叫 exit(exitcode) 如果 地位 是一个出口。打印错误消息并使用非零退出代码退出,如果 地位 是一个错误。只能在以下情况下调用 PyStatus_Exception(status) 为非零。

注解

在内部,python使用宏来设置 PyStatus.func ,而用于创建状态集的函数 funcNULL .

例子::

PyStatus alloc(void **ptr, size_t size)
{
    *ptr = PyMem_RawMalloc(size);
    if (*ptr == NULL) {
        return PyStatus_NoMemory();
    }
    return PyStatus_Ok();
}

int main(int argc, char **argv)
{
    void *ptr;
    PyStatus status = alloc(&ptr, 16);
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }
    PyMem_Free(ptr);
    return 0;
}

PyPreConfig

type PyPreConfig

用于预初始化Python的结构。

初始化预配置的函数:

void PyPreConfig_InitPythonConfig(PyPreConfig *preconfig)

用初始化预配置 Python Configuration .

void PyPreConfig_InitIsolatedConfig(PyPreConfig *preconfig)

用初始化预配置 Isolated Configuration .

结构字段:

int allocator

Python内存分配器的名称:

  • PYMEM_ALLOCATOR_NOT_SET (0 ):不更改内存分配器(使用默认值)

  • PYMEM_ALLOCATOR_DEFAULT (1 ):默认内存分配器

  • PYMEM_ALLOCATOR_DEBUG (2 ):带有调试挂钩的默认内存分配器

  • PYMEM_ALLOCATOR_MALLOC (3): force usage of malloc()

  • PYMEM_ALLOCATOR_MALLOC_DEBUG (4 ):强制使用 malloc() 使用调试挂钩

  • PYMEM_ALLOCATOR_PYMALLOC (5): Python pymalloc memory allocator

  • PYMEM_ALLOCATOR_PYMALLOC_DEBUG (6 ): Python pymalloc memory allocator 使用调试挂钩

PYMEM_ALLOCATOR_PYMALLOC and PYMEM_ALLOCATOR_PYMALLOC_DEBUG are not supported if Python is configured using --without-pymalloc

Memory Management .

默认值: PYMEM_ALLOCATOR_NOT_SET

int configure_locale

是否将LC_CTYPE区域设置设置为用户首选区域设置?

如果等于0,则设置 coerce_c_localecoerce_c_locale_warn 成员设置为0。

请参阅 locale encoding

默认值: 1 在Python配置中, 0 在隔离配置中。

int coerce_c_locale

如果等于2,则强制使用C语言环境。

如果等于1,则读取LC_CTYPE区域设置以决定是否应该强制它。

请参阅 locale encoding

默认值: -1 在Python配置中, 0 在隔离配置中。

int coerce_c_locale_warn

如果非零,则在强制C语言环境时发出警告。

默认值: -1 在Python配置中, 0 在隔离配置中。

int dev_mode

如果非零,则启用 Python Development Mode :请参见 PyConfig.dev_mode

默认值: -1 在Python模式下, 0 在隔离模式下。

int isolated

隔离模式:请参见 PyConfig.isolated

默认值: 0 在Python模式下, 1 在隔离模式下。

int legacy_windows_fs_encoding

如果非零,请执行以下操作:

已从 PYTHONLEGACYWINDOWSFSENCODING 环境变量值。

仅在Windows上可用。 #ifdef MS_WINDOWS 宏可用于特定于Windows的代码。

默认值: 0

int parse_argv

如果非零, Py_PreInitializeFromArgs()Py_PreInitializeFromBytesArgs() 分析他们的 argv 参数与常规python解析命令行参数的方式相同:请参见 Command Line Arguments .

默认值: 1 在Python配置中, 0 在隔离配置中。

int use_environment

使用 environment variables ?看见 PyConfig.use_environment

默认值: 1 在Python配置和 0 在隔离配置中。

int utf8_mode

如果非零,则启用 Python UTF-8 Mode

-X utf8 命令行选项和 PYTHONUTF8 环境变量。

默认值: -1 在Python配置和 0 在隔离配置中。

使用PyPreConfig预初始化Python

Python的预初始化:

当前预配置 (PyPreConfig 类型)存储在 _PyRuntime.preconfig

要预初始化python的函数:

PyStatus Py_PreInitialize(const PyPreConfig *preconfig)

从预初始化python 预配置 预配置。

预配置 一定不能是 NULL

PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char *const *argv)

从预初始化python 预配置 预配置。

解析 argv 命令行参数(字节字符串),如果 parse_argv预配置 是非零的。

预配置 一定不能是 NULL

PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t *const *argv)

从预初始化python 预配置 预配置。

解析 argv 命令行参数(宽字符串),如果 parse_argv预配置 是非零的。

预配置 一定不能是 NULL

调用方负责处理异常(错误或退出),使用 PyStatus_Exception()Py_ExitStatusException() .

For Python Configuration (PyPreConfig_InitPythonConfig()), if Python is initialized with command line arguments, the command line arguments must also be passed to preinitialize Python, since they have an effect on the pre-configuration like encodings. For example, the -X utf8 command line option enables the Python UTF-8 Mode.

PyMem_SetAllocator() 可以在之后调用 Py_PreInitialize() 以前 Py_InitializeFromConfig() 安装自定义内存分配器。以前可以叫它 Py_PreInitialize() 如果 PyPreConfig.allocator 设置为 PYMEM_ALLOCATOR_NOT_SET .

Python内存分配函数,如 PyMem_RawMalloc() 不能在Python预初始化之前使用,而直接调用 malloc()free() 永远是安全的。 Py_DecodeLocale() 不能在Python预初始化之前调用。

示例使用预初始化来启用 Python UTF-8 Mode ::

PyStatus status;
PyPreConfig preconfig;
PyPreConfig_InitPythonConfig(&preconfig);

preconfig.utf8_mode = 1;

status = Py_PreInitialize(&preconfig);
if (PyStatus_Exception(status)) {
    Py_ExitStatusException(status);
}

/* at this point, Python speaks UTF-8 */

Py_Initialize();
/* ... use Python API here ... */
Py_Finalize();

PyConfig

type PyConfig

包含要配置python的大多数参数的结构。

完成后, PyConfig_Clear() 函数必须用于释放配置内存。

结构方法:

void PyConfig_InitPythonConfig(PyConfig *config)

初始化配置,并使用 Python Configuration

void PyConfig_InitIsolatedConfig(PyConfig *config)

初始化配置,并使用 Isolated Configuration

PyStatus PyConfig_SetString(PyConfig *config, wchar_t *const *config_str, const wchar_t *str)

复制宽字符串 str 进入之内 *config_str .

Preinitialize Python 如果需要的话。

PyStatus PyConfig_SetBytesString(PyConfig *config, wchar_t *const *config_str, const char *str)

解码 str 使用 Py_DecodeLocale() 并将结果设置为 *config_str

Preinitialize Python 如果需要的话。

PyStatus PyConfig_SetArgv(PyConfig *config, int argc, wchar_t *const *argv)

设置命令行参数 (argv 成员: 配置 )从 argv 宽字符串列表。

Preinitialize Python 如果需要的话。

PyStatus PyConfig_SetBytesArgv(PyConfig *config, int argc, char *const *argv)

设置命令行参数 (argv 成员: 配置 )从 argv 字节字符串列表。使用以下命令解码字节 Py_DecodeLocale()

Preinitialize Python 如果需要的话。

PyStatus PyConfig_SetWideStringList(PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items)

设置宽字符串列表 list长度项目 .

Preinitialize Python 如果需要的话。

PyStatus PyConfig_Read(PyConfig *config)

读取所有python配置。

已初始化的字段保持不变。

这个 PyConfig_Read() 函数仅解析 PyConfig.argv 参数一次: PyConfig.parse_argv 设置为 2 在解析参数之后。由于Python参数从 PyConfig.argv ,则解析两次参数会将应用程序选项解析为Python选项。

Preinitialize Python 如果需要的话。

在 3.10 版更改: 这个 PyConfig.argv 参数现在只解析一次, PyConfig.parse_argv 设置为 2 在解析参数之后,只有在以下情况下才解析参数 PyConfig.parse_argv 等于 1

void PyConfig_Clear(PyConfig *config)

释放配置内存。

最多 PyConfig 方法: preinitialize Python 如果需要的话。在这种情况下,Python预初始化配置 (PyPreConfig )基于 PyConfig 。如果与共有的配置字段 PyPreConfig 都进行了优化,则必须在调用 PyConfig 方法:

而且,如果 PyConfig_SetArgv()PyConfig_SetBytesArgv() ,则必须在调用其他方法之前调用此方法,因为预初始化配置取决于命令行参数(如果 parse_argv 为非零)。

这些方法的调用方负责使用 PyStatus_Exception()Py_ExitStatusException() .

结构字段:

PyWideStringList argv

命令行参数: sys.argv

设置 parse_argv1 解析 argv 与常规Python解析Python命令行参数,然后将Python参数从 argv

如果 argv 为空,则添加一个空字符串以确保 sys.argv 总是存在的,而且永远不是空的。

默认值: NULL

也见 orig_argv 成员。

wchar_t *base_exec_prefix

sys.base_exec_prefix .

默认值: NULL

其中一部分 Python Path Configuration 输出。

wchar_t *base_executable

Python基本可执行文件: sys._base_executable

__PYVENV_LAUNCHER__ 环境变量。

设置自 PyConfig.executable 如果 NULL

默认值: NULL

其中一部分 Python Path Configuration 输出。

wchar_t *base_prefix

sys.base_prefix .

默认值: NULL

其中一部分 Python Path Configuration 输出。

int buffered_stdio

如果等于0且 configure_c_stdio 为非零,则禁用C流stdout和stderr上的缓冲。

属性设置为0。 -u 命令行选项和 PYTHONUNBUFFERED 环境变量。

stdin总是在缓冲模式下打开。

默认值: 1

int bytes_warning

如果等于1,则在比较时发出警告 bytesbytearray 使用 str ,或比较 bytes 使用 int

如果等于或大于2,则引发 BytesWarning 在这些情况下例外。

递增,递增的是 -b 命令行选项。

默认值: 0

wchar_t *check_hash_pycs_mode

控制基于哈希的 .pyc 文件:的值 --check-hash-based-pycs 命令行选项。

有效值:

  • L"always" :无论‘CHECK_SOURCE’标志值如何,都对源文件进行散列化以使其无效。

  • L"never" :假设基于散列的pyc总是有效的。

  • L"default" :基于散列的pycs中的‘check_source’标志确定无效。

默认值: L"default"

另请参阅 PEP 552 “确定性派对”。

int configure_c_stdio

如果非零,则配置C标准流:

  • 在Windows上,设置二进制模式 (O_BINARY )在stdin、stdout和stderr.

  • 如果 buffered_stdio 等于零,则禁用标准输入、标准输出和标准错误流的缓冲。

  • 如果 interactive 为非零,则在stdin和stdout上启用流缓冲(仅在Windows上启用stdout)。

默认值: 1 在Python配置中, 0 在隔离配置中。

int dev_mode

如果非零,则启用 Python Development Mode .

默认值: -1 在Python模式下, 0 在隔离模式下。

int dump_refs

是否转储Python引用?

如果非零,则转储出口处仍处于活动状态的所有对象。

设置为 1PYTHONDUMPREFS 环境变量。

我需要一个特殊的Python版本和 Py_TRACE_REFS 已定义宏。

默认值: 0

wchar_t *exec_prefix

安装平台相关Python文件的站点特定目录前缀: sys.exec_prefix

默认值: NULL

其中一部分 Python Path Configuration 输出。

wchar_t *executable

Python解释器的可执行二进制文件的绝对路径: sys.executable

默认值: NULL

其中一部分 Python Path Configuration 输出。

int faulthandler

是否启用故障处理机?

如果非零,请致电 faulthandler.enable() 在启动时。

设置为 1 通过 -X faulthandler 以及 PYTHONFAULTHANDLER 环境变量。

默认值: -1 在Python模式下, 0 在隔离模式下。

wchar_t *filesystem_encoding

Filesystem encodingsys.getfilesystemencoding()

在MacOS、Android和VxWorks上:使用 "utf-8" 默认情况下。

在Windows上:使用 "utf-8" 默认情况下,或 "mbcs" 如果 legacy_windows_fs_encodingPyPreConfig 是非零的。

其他平台上的默认编码:

  • "utf-8" 如果 PyPreConfig.utf8_mode 是非零的。

  • "ascii" 如果Python检测到 nl_langinfo(CODESET) 宣布ASCII编码(或HP-UX上的Roman8编码),而 mbstowcs() 函数从不同的编码(通常为Latin1)解码。

  • "utf-8" 如果 nl_langinfo(CODESET) 返回空字符串。

  • 否则,请使用 locale encodingnl_langinfo(CODESET) 结果。

在Python statup中,编码名称被规范化为Python编解码器名称。例如, "ANSI_X3.4-1968" 被替换为 "ascii"

另请参阅 filesystem_errors 会员。

wchar_t *filesystem_errors

Filesystem error handlersys.getfilesystemencodeerrors()

在Windows上:使用 "surrogatepass" 默认情况下,或 "replace" 如果 legacy_windows_fs_encodingPyPreConfig 是非零的。

在其他平台上:使用 "surrogateescape" 默认情况下。

支持的错误处理程序:

  • "strict"

  • "surrogateescape"

  • "surrogatepass" (仅支持UTF-8编码)

另请参阅 filesystem_encoding 会员。

unsigned long hash_seed
int use_hash_seed

随机散列函数种子。

如果 use_hash_seed 为零,则在Python启动时随机选择种子,并且 hash_seed 被忽略。

PYTHONHASHSEED 环境变量。

默认设置 use_hash_seed 值: -1 在Python模式下, 0 在隔离模式下。

wchar_t *home

python主目录。

如果 Py_SetPythonHome() 已被调用,如果未调用,则使用其参数 NULL

PYTHONHOME 环境变量。

默认值: NULL

其中一部分 Python Path Configuration 输入。

int import_time

如果非零,则配置文件导入时间。

设置 1-X importtime 选项和 PYTHONPROFILEIMPORTTIME 环境变量。

默认值: 0

int inspect

执行脚本或命令后进入交互模式。

如果大于0,则启用检查:当脚本作为第一个参数传递或使用-c选项时,请在执行脚本或命令后进入交互模式,即使在以下情况下也是如此 sys.stdin 看起来不像是终端。

递增,递增的是 -i 命令行选项。设置为 1 如果 PYTHONINSPECT 环境变量非空。

默认值: 0

int install_signal_handlers

是否安装Python信号处理程序?

默认值: 1 在Python模式下, 0 在隔离模式下。

int interactive

如果大于0,则启用交互模式(REPL)。

递增,递增的是 -i 命令行选项。

默认值: 0

int isolated

如果大于0,启用隔离模式:

默认值: 0 在Python模式下, 1 在隔离模式下。

另请参阅 PyPreConfig.isolated

int legacy_windows_stdio

如果非零,则使用 io.FileIO 而不是 io.WindowsConsoleIO 对于 sys.stdinsys.stdoutsys.stderr .

设置为 1 如果 PYTHONLEGACYWINDOWSSTDIO 环境变量设置为非空字符串。

仅在Windows上可用。 #ifdef MS_WINDOWS 宏可用于特定于Windows的代码。

默认值: 0

另请参阅 PEP 528 (将Windows控制台编码更改为UTF-8)。

int malloc_stats

如果非零,则转储统计信息 Python pymalloc memory allocator 在出口处。

设置为 1PYTHONMALLOCSTATS 环境变量。

如果使用 --without-pymalloc .

默认值: 0

wchar_t *platlibdir

平台库目录名称: sys.platlibdir

PYTHONPLATLIBDIR 环境变量。

默认值: PLATLIBDIR 在配置时由设置的宏 --with-platlibdir (默认值: "lib" )。

其中一部分 Python Path Configuration 输入。

3.9 新版功能.

wchar_t *pythonpath_env

Module search paths (sys.path) as a string separated by DELIM (os.path.pathsep).

PYTHONPATH 环境变量。

默认值: NULL

其中一部分 Python Path Configuration 输入。

PyWideStringList module_search_paths
int module_search_paths_set

模块搜索路径: sys.path

如果 module_search_paths_set 等于0,则计算 Python Path Configuration 重写 module_search_paths 和套装 module_search_paths_set1

Default: empty list (module_search_paths) and 0 (module_search_paths_set).

其中一部分 Python Path Configuration 输出。

int optimization_level

编译优化级别:

  • 0 :窥视孔优化器,设置 __debug__True

  • 1 :级别0,删除断言,设置 __debug__False

  • 2 :级别1,剥离文档字符串。

递增,递增的是 -O 命令行选项。设置为 PYTHONOPTIMIZE 环境变量值。

默认值: 0

PyWideStringList orig_argv

传递给Python可执行文件的原始命令行参数列表: sys.orig_argv

如果 orig_argv 列表为空,并且 argv 不是只包含空字符串的列表, PyConfig_Read() 副本 argv 变成 orig_argv 在修改之前 argv (如果 parse_argv 为非零)。

也见 argv 成员和 Py_GetArgcArgv() 功能。

默认值:空列表。

3.10 新版功能.

int parse_argv

是否解析命令行参数?

如果等于 1 ,解析 argv 与常规Python解析的方式相同 command line arguments ,并将Python参数从 argv

这个 PyConfig_Read() 函数仅解析 PyConfig.argv 参数一次: PyConfig.parse_argv 设置为 2 在解析参数之后。由于Python参数从 PyConfig.argv ,则解析两次参数会将应用程序选项解析为Python选项。

默认值: 1 在Python模式下, 0 在隔离模式下。

在 3.10 版更改: 这个 PyConfig.argv 现在只有在以下情况下才解析参数 PyConfig.parse_argv 等于 1

int parser_debug

解析器调试模式。如果大于0,则打开解析器调试输出(仅供专家使用,具体取决于编译选项)。

递增,递增的是 -d 命令行选项。设置为 PYTHONDEBUG 环境变量值。

默认值: 0

int pathconfig_warnings

在Unix上,如果非零,则计算 Python Path Configuration 可以将警告记录到 stderr 。如果等于0,则取消显示这些警告。

它对Windows没有影响。

默认值: 1 在Python模式下, 0 在隔离模式下。

其中一部分 Python Path Configuration 输入。

wchar_t *prefix

安装独立于平台的Python文件的特定于站点的目录前缀: sys.prefix

默认值: NULL

其中一部分 Python Path Configuration 输出。

wchar_t *program_name

用于初始化的程序名称 executable 并且在Python初始化期间的早期错误消息中。

  • 如果 Py_SetProgramName() 已被调用,请使用其参数。

  • 在MacOS上,使用 PYTHONEXECUTABLE 环境变量(如果设置)。

  • 如果 WITH_NEXT_FRAMEWORK 宏已定义,请使用 __PYVENV_LAUNCHER__ 环境变量(如果设置)。

  • 使用 argv[0]argv 如果可用且非空。

  • 否则,请使用 L"python" 在Windows上,或 L"python3" 在其他平台上。

默认值: NULL

其中一部分 Python Path Configuration 输入。

wchar_t *pycache_prefix

缓存的目录 .pyc 文件写入: sys.pycache_prefix

-X pycache_prefix=PATH 命令行选项和 PYTHONPYCACHEPREFIX 环境变量。

如果 NULLsys.pycache_prefix 设置为 None .

默认值: NULL

int quiet

静音模式。如果大于0,则在交互模式下启动Python时不显示版权和版本。

递增,递增的是 -q 命令行选项。

默认值: 0

wchar_t *run_command

的价值 -c 命令行选项。

使用方 Py_RunMain()

默认值: NULL

wchar_t *run_filename

命令行上传递的文件名:尾随命令行参数,不带 -c-m

例如,它设置为 script.pypython3 script.py arg 指挥部。

使用方 Py_RunMain()

默认值: NULL

wchar_t *run_module

的价值 -m 命令行选项。

使用方 Py_RunMain()

默认值: NULL

int show_ref_count

是否在退出时显示总引用计数?

按设置为1 -X showrefcount 命令行选项。

需要Python的调试版本 (Py_REF_DEBUG 必须定义宏)。

默认值: 0

int site_import

导入 site 启动时的模块?

如果等于零,则禁用模块站点的导入和与站点相关的操作 sys.path 这就意味着。

如果出现以下情况,还应禁用这些操作 site 模块稍后会显式导入(调用 site.main() 如果您希望它们被触发)。

设置为 0-S 命令行选项。

sys.flags.no_site 被设置为的反转值 site_import

默认值: 1

int skip_source_first_line

如果非零,则跳过 PyConfig.run_filename 消息来源。

它允许使用非unix形式的 #!cmd 。这仅适用于特定于DOS的黑客攻击。

设置为 1-x 命令行选项。

默认值: 0

wchar_t *stdio_encoding
wchar_t *stdio_errors

编码和编码错误 sys.stdinsys.stdoutsys.stderr (但是 sys.stderr 始终使用 "backslashreplace" 错误处理程序)。

如果 Py_SetStandardStreamEncoding() 已被调用,请使用其 错误错误 参数(如果它们不是 NULL

使用 PYTHONIOENCODING 环境变量(如果非空)。

默认编码:

默认错误处理程序:

  • 在Windows上:使用 "surrogateescape"

  • "surrogateescape" 如果 PyPreConfig.utf8_mode 非零,或者如果LC_CTYPE区域设置为“C”或“POSIX”。

  • "strict" 不然的话。

int tracemalloc

是否启用tracemalloc?

如果非零,请致电 tracemalloc.start() 在启动时。

设置者 -X tracemalloc=N 命令行选项,并由 PYTHONTRACEMALLOC 环境变量。

默认值: -1 在Python模式下, 0 在隔离模式下。

int use_environment

使用 environment variables

如果等于零,则忽略 environment variables

默认值: 1 在Python配置和 0 在隔离配置中。

int user_site_directory

如果非零,则将用户站点目录添加到 sys.path

设置为 0-s-I 命令行选项。

设置为 0PYTHONNOUSERSITE 环境变量。

默认值: 1 在Python模式下, 0 在隔离模式下。

int verbose

详细模式。如果大于0,则在每次导入模块时打印一条消息,显示从中加载模块的位置(文件名或内置模块)。

如果大于或等于2,则为搜索模块时检查的每个文件打印一条消息。还提供了有关退出时模块清理的信息。

递增,递增的是 -v 命令行选项。

设置为 PYTHONVERBOSE 环境变量值。

默认值: 0

PyWideStringList warnoptions

的选项 warnings 构建警告筛选器的模块,优先级从低到高: sys.warnoptions

这个 warnings 模块添加 sys.warnoptions 按相反的顺序:最后一个 PyConfig.warnoptions 项成为的第一个项 warnings.filters 首先检查(最高优先级)。

默认值:空列表。

int write_bytecode

如果等于0,则Python不会尝试写入 .pyc 关于源模块导入的文件。

设置为 0-B 命令行选项和 PYTHONDONTWRITEBYTECODE 环境变量。

sys.dont_write_bytecode 初始化为 write_bytecode .

默认值: 1

PyWideStringList xoptions

的值 -X 命令行选项: sys._xoptions

默认值:空列表。

如果 parse_argv 是非零的, argv 参数的解析方式与常规Python的解析方式相同 command line arguments ,并且Python参数将从 argv

这个 xoptions 解析选项以设置其他选项:请参阅 -X 命令行选项。

在 3.9 版更改: 这个 show_alloc_count 字段已被删除。

使用pyconfig初始化

初始化python的函数:

PyStatus Py_InitializeFromConfig(const PyConfig *config)

从初始化python 配置 配置。

调用方负责处理异常(错误或退出),使用 PyStatus_Exception()Py_ExitStatusException() .

如果 PyImport_FrozenModules()PyImport_AppendInittab()PyImport_ExtendInittab() ,则必须在Python预初始化之后、Python初始化之前设置或调用它们。

当前配置 (PyConfig 类型)存储在 PyInterpreterState.config

设置程序名称的示例:

void init_python(void)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Set the program name. Implicitly preinitialize Python. */
    status = PyConfig_SetString(&config, &config.program_name,
                                L"/path/to/my_program");
    if (PyStatus_Exception(status)) {
        goto exception;
    }

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) {
        goto exception;
    }
    PyConfig_Clear(&config);
    return;

exception:
    PyConfig_Clear(&config);
    Py_ExitStatusException(status);
}

更完整的示例修改默认配置,读取配置,然后重写一些参数:

PyStatus init_python(const char *program_name)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Set the program name before reading the configuration
       (decode byte string from the locale encoding).

       Implicitly preinitialize Python. */
    status = PyConfig_SetBytesString(&config, &config.program_name,
                                     program_name);
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Read all configuration at once */
    status = PyConfig_Read(&config);
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Append our custom search path to sys.path */
    status = PyWideStringList_Append(&config.module_search_paths,
                                     L"/path/to/more/modules");
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Override executable computed by PyConfig_Read() */
    status = PyConfig_SetString(&config, &config.executable,
                                L"/path/to/my_executable");
    if (PyStatus_Exception(status)) {
        goto done;
    }

    status = Py_InitializeFromConfig(&config);

done:
    PyConfig_Clear(&config);
    return status;
}

隔离配置

PyPreConfig_InitIsolatedConfig()PyConfig_InitIsolatedConfig() 函数创建一个配置来将Python与系统隔离。例如,将Python嵌入到应用程序中。

此配置忽略全局配置变量、环境变量、命令行参数 (PyConfig.argv 未分析)和用户站点目录。C标准流(例如: stdout )并且LC_CTYPE区域设置保持不变。未安装信号处理程序。

配置文件仍与此配置一起使用。设置 Python Path Configuration (“输出字段”)忽略这些配置文件,并避免计算默认路径配置的函数。

python配置

PyPreConfig_InitPythonConfig()PyConfig_InitPythonConfig() 函数创建一个配置来构建一个自定义的python,它的行为与常规的python相同。

环境变量和命令行参数用于配置python,而全局配置变量则被忽略。

This function enables C locale coercion (PEP 538) and Python UTF-8 Mode (PEP 540) depending on the LC_CTYPE locale, PYTHONUTF8 and PYTHONCOERCECLOCALE environment variables.

Python路径配置

PyConfig 包含路径配置的多个字段:

如果没有设置至少一个“输出字段”,Python将计算路径配置以填充未设置的字段。如果 module_search_paths_set 等于0, module_search_paths 被覆盖并且 module_search_paths_set 设置为1。

通过显式设置上面列出的所有路径配置输出字段,可以完全忽略计算默认路径配置的函数。即使字符串非空,也将其视为已设置。 module_search_paths 如果 module_search_paths_set 设置为1。在这种情况下,路径配置输入字段也会被忽略。

集合 pathconfig_warnings 到0以在计算路径配置时取消显示警告(仅限Unix,Windows不记录任何警告)。

如果 base_prefixbase_exec_prefix 未设置字段,它们从 prefixexec_prefix 分别。

Py_RunMain()Py_Main() 修改 sys.path

如果 site_import 非零, sys.path 可以通过 site 模块。如果 user_site_directory 非零且用户的站点包目录存在,则 site 模块将用户的站点包目录附加到 sys.path .

路径配置使用以下配置文件:

  • pyvenv.cfg

  • python._pth (仅限Windows)

  • pybuilddir.txt (仅限Unix)

这个 __PYVENV_LAUNCHER__ 环境变量用于设置 PyConfig.base_executable

py_runmain()。

int Py_RunMain(void)

执行命令 (PyConfig.run_command )脚本 (PyConfig.run_filename )或者模块 (PyConfig.run_module )在命令行或配置中指定。

默认情况下,如果 -i 使用了选项,运行repl。

最后,完成python并返回一个可传递给 exit() 功能。

Python Configuration 例如,自定义的python总是在独立模式下运行, Py_RunMain() .

Py_GetArgcArgv()

void Py_GetArgcArgv(int *argc, wchar_t ***argv)

在Python修改原始命令行参数之前,获取它们。

也见 PyConfig.orig_argv 成员。

多阶段初始化专用临时API

本节是一个私有的临时API,引入了多阶段初始化,这是 PEP 432

  • “core”初始化阶段,“bare minimum python”:

    • 内置类型;

    • 内置异常;

    • 内置和冻结模块;

    • 这个 sys 模块仅部分初始化(例如: sys.path 还不存在)。

  • “main”初始化阶段,python完全初始化:

私人临时API:

  • PyConfig._init_main :如果设置为0, Py_InitializeFromConfig() 在“核心”初始化阶段停止。

  • PyConfig._isolated_interpreter :如果非零,则不允许线程、子进程和fork。

PyStatus _Py_InitializeMain(void)

进入“主”初始化阶段,完成python初始化。

在“核心”阶段没有导入模块,并且 importlib 未配置模块:的 Path Configuration 仅在“主”阶段应用。它可能允许在python中自定义python来重写或调优 Path Configuration ,或者安装一个自定义 sys.meta_path 进口商或进口钩等。

有可能计算出 Path Configuration 在Python中,在核心阶段之后,在主阶段之前,这是 PEP 432 动力。

“核心”阶段没有正确定义:在这个阶段应该是什么和不应该是什么还没有指定。API被标记为私有和临时的:在设计适当的公共API之前,可以随时修改甚至删除API。

在“core”和“main”初始化阶段之间运行python代码的示例:

void init_python(void)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);
    config._init_main = 0;

    /* ... customize 'config' configuration ... */

    status = Py_InitializeFromConfig(&config);
    PyConfig_Clear(&config);
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }

    /* Use sys.stderr because sys.stdout is only created
       by _Py_InitializeMain() */
    int res = PyRun_SimpleString(
        "import sys; "
        "print('Run Python code before _Py_InitializeMain', "
               "file=sys.stderr)");
    if (res < 0) {
        exit(1);
    }

    /* ... put more configuration code here ... */

    status = _Py_InitializeMain();
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }
}