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_PYMALLOC
andPYMEM_ALLOCATOR_PYMALLOC_DEBUG
are 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.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”:
“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);
}
}