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)¶
追加 item 到 list .
必须预先初始化python才能调用此函数。
-
PyStatus PyWideStringList_Insert(PyWideStringList *list, Py_ssize_t index, const wchar_t *item)¶
插入 item 进入之内 list 在 指数 .
如果 指数 大于或等于 list 长度,附加 item 到 list .
指数 必须大于或等于0。
必须预先初始化python才能调用此函数。
结构字段:
-
Py_ssize_t length¶
列表长度。
-
wchar_t **items¶
列出项目。
-
PyStatus PyWideStringList_Append(PyWideStringList *list, const wchar_t *item)¶
PyStatus¶
-
type PyStatus¶
存储初始化函数状态的结构:成功、错误或退出。
对于错误,它可以存储创建错误的C函数名。
结构字段:
-
int exitcode¶
退出代码。参数传递给
exit().
-
const char *err_msg¶
错误消息。
-
const char *func¶
创建错误的函数的名称,可以是
NULL.
创建状态的函数:
处理状态的函数:
-
int PyStatus_Exception(PyStatus status)¶
状态是错误还是退出?如果为真,则必须处理异常;通过调用
Py_ExitStatusException()例如。
-
int exitcode¶
注解
在内部,python使用宏来设置 PyStatus.func ,而用于创建状态集的函数 func 到 NULL .
例子::
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 ofmalloc()PYMEM_ALLOCATOR_MALLOC_DEBUG(4):强制使用malloc()使用调试挂钩PYMEM_ALLOCATOR_PYMALLOC(5): Python pymalloc memory allocatorPYMEM_ALLOCATOR_PYMALLOC_DEBUG(6): Python pymalloc memory allocator 使用调试挂钩
PYMEM_ALLOCATOR_PYMALLOCandPYMEM_ALLOCATOR_PYMALLOC_DEBUGare not supported if Python is configured using--without-pymalloc默认值:
PYMEM_ALLOCATOR_NOT_SET。
-
int configure_locale¶
是否将LC_CTYPE区域设置设置为用户首选区域设置?
如果等于0,则设置
coerce_c_locale和coerce_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¶
如果非零,请执行以下操作:
设置
PyPreConfig.utf8_mode至0,设置
PyConfig.filesystem_encoding至"mbcs",设置
PyConfig.filesystem_errors至"replace"。
已从
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在隔离配置中。
-
void PyPreConfig_InitPythonConfig(PyPreConfig *preconfig)¶
使用PyPreConfig预初始化Python¶
Python的预初始化:
设置Python内存分配器 (
PyPreConfig.allocator)配置LC_CTYPE区域设置 (locale encoding )
Set the Python UTF-8 Mode (
PyPreConfig.utf8_mode)
当前预配置 (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。
最多
PyConfig方法: preinitialize Python 如果需要的话。在这种情况下,Python预初始化配置 (PyPreConfig)基于PyConfig。如果与共有的配置字段PyPreConfig都进行了优化,则必须在调用PyConfig方法:而且,如果
PyConfig_SetArgv()或PyConfig_SetBytesArgv(),则必须在调用其他方法之前调用此方法,因为预初始化配置取决于命令行参数(如果parse_argv为非零)。这些方法的调用方负责使用
PyStatus_Exception()和Py_ExitStatusException().结构字段:
-
PyWideStringList argv¶
命令行参数:
sys.argv。设置
parse_argv至1解析argv与常规Python解析Python命令行参数,然后将Python参数从argv。如果
argv为空,则添加一个空字符串以确保sys.argv总是存在的,而且永远不是空的。默认值:
NULL。也见
orig_argv成员。
-
wchar_t *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¶
-
默认值:
NULL。其中一部分 Python Path Configuration 输出。
-
int buffered_stdio¶
如果等于0且
configure_c_stdio为非零,则禁用C流stdout和stderr上的缓冲。属性设置为0。
-u命令行选项和PYTHONUNBUFFERED环境变量。stdin总是在缓冲模式下打开。
默认值:
1。
-
int bytes_warning¶
如果等于1,则在比较时发出警告
bytes或bytearray使用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引用?
如果非零,则转储出口处仍处于活动状态的所有对象。
设置为
1由PYTHONDUMPREFS环境变量。我需要一个特殊的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 encoding :
sys.getfilesystemencoding()。在MacOS、Android和VxWorks上:使用
"utf-8"默认情况下。在Windows上:使用
"utf-8"默认情况下,或"mbcs"如果legacy_windows_fs_encoding的PyPreConfig是非零的。其他平台上的默认编码:
"utf-8"如果PyPreConfig.utf8_mode是非零的。"ascii"如果Python检测到nl_langinfo(CODESET)宣布ASCII编码(或HP-UX上的Roman8编码),而mbstowcs()函数从不同的编码(通常为Latin1)解码。"utf-8"如果nl_langinfo(CODESET)返回空字符串。否则,请使用 locale encoding :
nl_langinfo(CODESET)结果。
在Python statup中,编码名称被规范化为Python编解码器名称。例如,
"ANSI_X3.4-1968"被替换为"ascii"。另请参阅
filesystem_errors会员。
-
wchar_t *filesystem_errors¶
Filesystem error handler :
sys.getfilesystemencodeerrors()。在Windows上:使用
"surrogatepass"默认情况下,或"replace"如果legacy_windows_fs_encoding的PyPreConfig是非零的。在其他平台上:使用
"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 isolated¶
如果大于0,启用隔离模式:
sys.path既不包含脚本的目录(计算自argv[0]或当前目录)或用户的站点包目录。python repl不导入
readline也不在交互提示上启用默认的readline配置。集合
use_environment和user_site_directory到0。
默认值:
0在Python模式下,1在隔离模式下。另请参阅
PyPreConfig.isolated。
-
int legacy_windows_stdio¶
如果非零,则使用
io.FileIO而不是io.WindowsConsoleIO对于sys.stdin,sys.stdout和sys.stderr.设置为
1如果PYTHONLEGACYWINDOWSSTDIO环境变量设置为非空字符串。仅在Windows上可用。
#ifdef MS_WINDOWS宏可用于特定于Windows的代码。默认值:
0。另请参阅 PEP 528 (将Windows控制台编码更改为UTF-8)。
-
int malloc_stats¶
如果非零,则转储统计信息 Python pymalloc memory allocator 在出口处。
设置为
1由PYTHONMALLOCSTATS环境变量。如果使用
--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 byDELIM(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_set至1。Default: empty list (
module_search_paths) and0(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环境变量。如果
NULL,sys.pycache_prefix设置为None.默认值:
NULL。
-
wchar_t *run_command¶
的价值
-c命令行选项。使用方
Py_RunMain()。默认值:
NULL。
-
wchar_t *run_filename¶
命令行上传递的文件名:尾随命令行参数,不带
-c或-m。例如,它设置为
script.py由python3 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.stdin,sys.stdout和sys.stderr(但是sys.stderr始终使用"backslashreplace"错误处理程序)。如果
Py_SetStandardStreamEncoding()已被调用,请使用其 错误 和 错误 参数(如果它们不是NULL。使用
PYTHONIOENCODING环境变量(如果非空)。默认编码:
"UTF-8"如果PyPreConfig.utf8_mode是非零的。否则,请使用 locale encoding 。
默认错误处理程序:
在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 。
默认值:
1在Python配置和0在隔离配置中。
-
int user_site_directory¶
如果非零,则将用户站点目录添加到
sys.path。设置为
0由PYTHONNOUSERSITE环境变量。默认值:
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。默认值:空列表。
-
void PyConfig_InitPythonConfig(PyConfig *config)¶
如果 parse_argv 是非零的, argv 参数的解析方式与常规Python的解析方式相同 command line arguments ,并且Python参数将从 argv 。
这个 xoptions 解析选项以设置其他选项:请参阅 -X 命令行选项。
在 3.9 版更改: 这个 show_alloc_count 字段已被删除。
使用pyconfig初始化¶
初始化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 包含路径配置的多个字段:
路径配置输入:
当前工作目录:获取绝对路径
PATH获取程序完整路径的环境变量(从PyConfig.program_name)__PYVENV_LAUNCHER__环境变量(仅限Windows)注册表中“SoftwarePythonPythonCoreX.YPythonPath”下的应用程序路径,该注册表位于HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下(其中X.Y是Python版本)。
路径配置输出字段:
如果没有设置至少一个“输出字段”,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_prefix 或 base_exec_prefix 未设置字段,它们从 prefix 和 exec_prefix 分别。
Py_RunMain() 和 Py_Main() 修改 sys.path :
如果
run_filename是一个包含__main__.py脚本,前置run_filename到sys.path.如果
isolated为零:如果
run_module已设置,将当前目录预先设置为sys.path. 如果当前目录无法读取,则不执行任何操作。如果
run_filename如果已设置,则将文件名的目录预先设置为sys.path.否则,在
sys.path.
如果 site_import 非零, sys.path 可以通过 site 模块。如果 user_site_directory 非零且用户的站点包目录存在,则 site 模块将用户的站点包目录附加到 sys.path .
路径配置使用以下配置文件:
pyvenv.cfgpython._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”:
“main”初始化阶段,python完全初始化:
安装和配置
importlib;应用 Path Configuration ;
安装信号处理器;
完成
sys模块初始化(例如:创建sys.stdout和sys.path;启用可选功能,如
faulthandler和tracemalloc;导入
site模块;等。
私人临时API:
PyConfig._init_main:如果设置为0,Py_InitializeFromConfig()在“核心”初始化阶段停止。PyConfig._isolated_interpreter:如果非零,则不允许线程、子进程和fork。
在“核心”阶段没有导入模块,并且 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);
}
}