操作系统实用工具

PyObject *PyOS_FSPath(PyObject *path)
返回值:新的引用。 Part of the Stable ABI since version 3.6.

返回 path 在文件系统中的表示形式。 如果该对象是一个 strbytes 对象,则返回一个新的 strong reference。 如果对象实现了 os.PathLike 接口,则只要它是一个 strbytes 对象就将返回 __fspath__()。 在其他情况下将引发 TypeError 并返回 NULL

3.6 新版功能.

int Py_FdIsInteractive(FILE *fp, const char *filename)

如果名称为 filename 的标准Return true (nonzero) if the standard I/O 文件 fp 被确认为可交互的则返回真(非零)值。 所有 isatty(fileno(fp)) 为真值的文件都属于这种情况。 如果 PyConfig.interactive 为非零值,此函数在 filename 指针为 NULL 或者其名称等于字符串 '<stdin>''???' 之一时也将返回真值。

此函数不可在 Python 被初始化之前调用。

void PyOS_BeforeFork()
Part of the Stable ABI on platforms with fork() since version 3.7.

在进程分叉之前准备某些内部状态的函数。 此函数应当在调用 fork() 或者任何类似的克隆当前进程的函数之前被调用。 只适用于定义了 fork() 的系统。

警告

C fork() 调用应当只在 "main" 线程 (位于 "main" 解释器) 中进行。 对于 PyOS_BeforeFork() 来说也是如此。

3.7 新版功能.

void PyOS_AfterFork_Parent()
Part of the Stable ABI on platforms with fork() since version 3.7.

在进程分叉之后更新某些内部状态的函数。 此函数应当在调用 fork() 或任何类似的克隆当前进程的函数之后被调用,无论进程克隆是否成功。 只适用于定义了 fork() 的系统。

警告

C fork() 调用应当只在 "main" 线程 (位于 "main" 解释器) 中进行。 对于 PyOS_AfterFork_Parent() 来说也是如此。

3.7 新版功能.

void PyOS_AfterFork_Child()
Part of the Stable ABI on platforms with fork() since version 3.7.

在进程分叉之后更新内部解释器状态的函数。 此函数必须在调用 fork() 或任何类似的克隆当前进程的函数之后在子进程中被调用,如果该进程有机会回调到 Python 解释器的话。 只适用于定义了 fork() 的系统。

警告

C fork() 调用应当只在 "main" 线程 (位于 "main" 解释器) 中进行。 对于 PyOS_AfterFork_Child() 来说也是如此。

3.7 新版功能.

参见

os.register_at_fork() 允许注册可被 PyOS_BeforeFork(), PyOS_AfterFork_Parent()PyOS_AfterFork_Child() 调用的自定义 Python 函数。

void PyOS_AfterFork()
Part of the Stable ABI on platforms with fork().

在进程分叉之后更新某些内部状态的函数;如果要继续使用 Python 解释器则此函数应当在新进程中被调用。 如果已将一个新的可执行文件载入到新进程中,则不需要调用此函数。

3.7 版后已移除: 此函数已被 PyOS_AfterFork_Child() 取代。

int PyOS_CheckStack()
Part of the Stable ABI on platforms with USE_STACKCHECK since version 3.7.

当解释器耗尽栈空间时返回真值。 这是一个可靠的检查,但仅在已定义 USE_STACKCHECK 时可用(目前是在使用 Microsoft Visual C++ 编译器的特定 Windows 版本上)。 USE_STACKCHECK 将被自动定义;你绝不应该在你自己的代码中改变此定义。will be defined automatically; you should never change the definition in your own code.

PyOS_sighandler_t PyOS_getsig(int i)
Part of the Stable ABI.

返回信号 i 的当前信号处理句柄。 这是一个对 sigaction()signal() 的简单包装器。 请勿直接调用这两个函数! PyOS_sighandler_t 是对应于 void (*)(int) 的类型定义别名。

PyOS_sighandler_t PyOS_setsig(int i, PyOS_sighandler_t h)
Part of the Stable ABI.

将信号 i 的信号处理句柄设为 h;返回旧的信号处理句柄。 这是一个对 sigaction()signal() 的简单包装器。 请勿直接调用这两个函数! PyOS_sighandler_t 是对应于 void (*)(int) 的类型定义别名。

wchar_t *Py_DecodeLocale(const char *arg, size_t *size)
Part of the Stable ABI since version 3.7.

警告

此函数不应当被直接调用:请使用 PyConfig API 以及可确保 对 Python 进行预初始化PyConfig_SetBytesString() 函数。

此函数不可在This function must not be called before 对 Python 进行预初始化 之前被调用以便正确地配置 LC_CTYPE 语言区域:请参阅 Py_PreInitialize() 函数。

使用 filesystem encoding and error handler 来解码一个字节串。 如果错误处理句柄为 surrogateescape 错误处理句柄,则不可解码的字节将被解码为 U+DC80..U+DCFF 范围内的字符;而如果一个字节序列可被解码为代理字符,则其中的字节会使用 surrogateescape 错误处理句柄来转义而不是解码它们。

返回一个指向新分配的由宽字符组成的字符串的指针,使用 PyMem_RawFree() 来释放内存。 如果 size 不为 NULL,则将排除了 null 字符的宽字符数量写入到 *size

在解码错误或内存分配错误时返回 NULL。 如果 size 不为 NULL,则 *size 将在内存错误时设为 (size_t)-1 或在解码错误时设为 (size_t)-2

filesystem encoding and error handler 是由 PyConfig_Read() 来选择的: 参见 PyConfigfilesystem_encodingfilesystem_errors 等成员。

解码错误绝对不应当发生,除非 C 库有程序缺陷。

请使用 Py_EncodeLocale() 函数来将字符串编码回字节串。

3.5 新版功能.

在 3.7 版更改: 现在此函数在 Python UTF-8 模式 下将使用 UTF-8 编码格式。

在 3.8 版更改: 现在如果在 Windows 上 PyPreConfig.legacy_windows_fs_encoding 为零则此函数将使用 UTF-8 编码格式;

char *Py_EncodeLocale(const wchar_t *text, size_t *error_pos)
Part of the Stable ABI since version 3.7.

将一个由宽字符组成的字符串编码为 filesystem encoding and error handler。 如果错误处理句柄为 surrogateescape 错误处理句柄,则在 U+DC80..U+DCFF 范围内的代理字符会被转换为字节值 0x80..0xFF。

返回一个指向新分配的字节串的指针,使用 PyMem_Free() 来释放内存。 当发生编码错误或内存分配错误时返回 NULL

如果 error_pos 不为 NULL,则成功时会将 *error_pos 设为 (size_t)-1,或是在发生编码错误时设为无效字符的索引号。

filesystem encoding and error handler 是由 PyConfig_Read() 来选择的: 参见 PyConfigfilesystem_encodingfilesystem_errors 等成员。

请使用 Py_DecodeLocale() 函数来将字节串解码回由宽字符组成的字符串。

警告

此函数不可在This function must not be called before 对 Python 进行预初始化 之前被调用以便正确地配置 LC_CTYPE 语言区域:请参阅 Py_PreInitialize() 函数。

3.5 新版功能.

在 3.7 版更改: 现在此函数在 Python UTF-8 模式 下将使用 UTF-8 编码格式。

在 3.8 版更改: 现在如果在 Windows 上 PyPreConfig.legacy_windows_fs_encoding 为零则此函数将使用 UTF-8 编码格式。

系统功能

这些是使来自 sys 模块的功能可以让 C 代码访问的工具函数。 它们都可用于当前解释器线程的 sys 模块的字典,该字典包含在内部线程状态结构体中。

PyObject *PySys_GetObject(const char *name)
返回值:借入的引用。 Part of the Stable ABI.

返回来自 sys 模块的对象 name 或者如果它不存在则返回 NULL,并且不会设置异常。

int PySys_SetObject(const char *name, PyObject *v)
Part of the Stable ABI.

sys 模块中的 name 设为 v 除非 vNULL,在此情况下 name 将从 sys 模块中被删除。 成功时返回 0,发生错误时返回 -1

void PySys_ResetWarnOptions()
Part of the Stable ABI.

sys.warnoptions 重置为空列表。 此函数可在 Py_Initialize() 之前被调用。

void PySys_AddWarnOption(const wchar_t *s)
Part of the Stable ABI.

此 API 被保留用于向下兼容:应当改为采用设置 PyConfig.warnoptions,参见 Python 初始化配置

s 添加到 sys.warnoptions。 此函数必须在 Py_Initialize() 之前被调用以便影响警告过滤器列表。

3.11 版后已移除.

void PySys_AddWarnOptionUnicode(PyObject *unicode)
Part of the Stable ABI.

此 API 被保留用于向下兼容:应当改为采用设置 PyConfig.warnoptions,参见 Python 初始化配置

unicode 添加到 sys.warnoptions

注意:目前此函数不可在 CPython 实现之外使用,因为它必须在 Py_Initialize() 中的 warnings 显式导入之前被调用,但是要等运行时已初始化到足以允许创建 Unicode 对象时才能被调用。

3.11 版后已移除.

void PySys_SetPath(const wchar_t *path)
Part of the Stable ABI.

此 API 被保留用于向下兼容:应当改为采用设置 PyConfig.module_search_pathsPyConfig.module_search_paths_set,参见 Python 初始化配置

sys.path 设为由在 path 中找到的路径组成的列表对象,该参数应为使用特定平台的搜索路径分隔符 (在 Unix 上为 :,在 Windows 上为 ;) 分隔的路径的列表。

3.11 版后已移除.

void PySys_WriteStdout(const char *format, ...)
Part of the Stable ABI.

将以 format 描述的输出字符串写入到 sys.stdout。 不会引发任何异常,即使发生了截断(见下文)。

format 应当将已格式化的输出字符串的总大小限制在 1000 字节以下 -- 超过 1000 字节后,输出字符串会被截断。 特别地,这意味着不应出现不受限制的 "%s" 格式;它们应当使用 "%.<N>s" 来限制,其中 <N> 是一个经计算使得 <N> 与其他已格式化文本的最大尺寸之和不会超过 1000 字节的十进制数字。 还要注意 "%f",它可能为非常大的数字打印出数以百计的数位。

如果发生了错误,sys.stdout 会被清空,已格式化的消息将被写入到真正的 (C 层级) stdout

void PySys_WriteStderr(const char *format, ...)
Part of the Stable ABI.

类似 PySys_WriteStdout(),但改为写入到 sys.stderrstderr

void PySys_FormatStdout(const char *format, ...)
Part of the Stable ABI.

类似 PySys_WriteStdout() 的函数将会使用 PyUnicode_FromFormatV() 来格式化消息并且不会将消息截短至任意长度。

3.2 新版功能.

void PySys_FormatStderr(const char *format, ...)
Part of the Stable ABI.

类似 PySys_FormatStdout(),但改为写入到 sys.stderrstderr

3.2 新版功能.

void PySys_AddXOption(const wchar_t *s)
Part of the Stable ABI since version 3.7.

此 API 被保留用于向下兼容:应当改为采用设置 PyConfig.xoptions,参见 Python 初始化配置

s 解析为一个由 -X 选项组成的集合并将它们添加到 PySys_GetXOptions() 所返回的当前选项映射。 此函数可以在 Py_Initialize() 之前被调用。

3.2 新版功能.

3.11 版后已移除.

PyObject *PySys_GetXOptions()
返回值:借入的引用。 Part of the Stable ABI since version 3.7.

返回当前 -X 选项的字典,类似于 sys._xoptions。 发生错误时,将返回 NULL 并设置一个异常。

3.2 新版功能.

int PySys_Audit(const char *event, const char *format, ...)

引发一个审计事件并附带任何激活的钩子。 成功时返回零值或在失败时返回非零值并设置一个异常。

如果已添加了任何钩子,则将使用 format 和其他参数来构造一个用入传入的元组。 除 N 以外,在 Py_BuildValue() 中使用的格式字符均可使用。 如果构建的值不是一个元组,它将被添加到一个单元素元组中。 (格式选项 N 会消耗一个引用,但是由于没有办法知道此函数的参数是否将被消耗,因此使用它可能导致引用泄漏。)

请注意 # 格式字符应当总是被当作 Py_ssize_t 来处理,无论是否定义了 PY_SSIZE_T_CLEAN

sys.audit() 会执行与来自 Python 代码的函数相同的操作。

3.8 新版功能.

在 3.8.2 版更改: 要求 Py_ssize_t 用于 # 格式字符。 在此之前,会引发一个不可避免的弃用警告。

int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)

将可调用对象 hook 添加到激活的审计钩子列表。 在成功时返回零而在失败时返回非零值。 如果运行时已经被初始化,还会在失败时设置一个错误。 通过此 API 添加的钩子会针对在运行时创建的所有解释器被调用。

userData 指针会被传入钩子函数。 因于钩子函数可能由不同的运行时调用,该指针不应直接指向 Python 状态。

此函数可在 Py_Initialize() 之前被安全地调用。 如果在运行时初始化之后被调用,现有的审计钩子将得到通知并可能通过引发一个从 Exception 子类化的错误静默地放弃操作(其他错误将不会被静默)。

这个钩子函数的类型为 int (*)(const char *event, PyObject *args, void *userData),其中 args 会保证为 PyTupleObject。 这个钩子函数总是会附带引发该事件的 Python 解释器所持有的 GIL 来调用。

请参阅 PEP 578 了解有关审计的详细描述。 在运行时和标准库中会引发审计事件的函数清单见 审计事件表。 更多细节见每个函数的文档。

引发 审计事件 sys.addaudithook,不附带任何参数。

3.8 新版功能.

过程控制

void Py_FatalError(const char *message)
Part of the Stable ABI.

打印一个致命错误消息并杀死进程。 不会执行任何清理。 此函数应当仅在检测到可能令继续使用 Python 解释器会有危险的情况时被发起调用;例如对象管理已被破坏的时候。 在 Unix 上,会调用标准 C 库函数 abort() 并将由它来尝试生成一个 core 文件。

The Py_FatalError() function is replaced with a macro which logs automatically the name of the current function, unless the Py_LIMITED_API macro is defined.

在 3.9 版更改: 自动记录函数名称。

void Py_Exit(int status)
Part of the Stable ABI.

退出当前进程。 这将调用 Py_FinalizeEx() 然后再调用标准 C 库函数 exit(status)。 如果 Py_FinalizeEx() 提示错误,退出状态将被设为 120。

在 3.6 版更改: 来自最终化的错误不会再被忽略。

int Py_AtExit(void (*func)())
Part of the Stable ABI.

注册一个由 Py_FinalizeEx() 调用的清理函数。 调用清理函数将不传入任何参数且不应返回任何值。 最多可以注册32 个清理函数。 当注册成功时,Py_AtExit() 将返回 0;失败时,它将返回 -1。 最后注册的清理函数会最先被调用。 每个清理函数将至多被调用一次。 由于 Python 的内部最终化将在清理函数之前完成,因此 Python API 不应被 func 调用。