操作系统实用程序

PyObject *PyOS_FSPath(PyObject *path)
返回值: 新引用. 自 3.6 版本起成为 稳定 ABI 的一部分.

返回 path 的文件系统表示。如果对象是 strbytes 对象,则返回新的 强引用。如果对象实现了 os.PathLike 接口,则只要 __fspath__() 返回的是 strbytes 对象,就返回它。否则,会引发 TypeError 并返回 NULL

在 3.6 版本加入。

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

如果名称为 filename 的标准 I/O 文件 fp 被认为是交互式的,则返回 true (非零)。对于 isatty(fileno(fp)) 为 true 的文件,就是这种情况。如果 PyConfig.interactive 为非零,则当 filename 指针为 NULL 或名称等于字符串 '<stdin>''???' 中的一个时,此函数也返回 true。

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

void PyOS_BeforeFork()
自 3.7 版本起,在支持 fork() 的平台上成为 稳定 ABI 的一部分。

在进程 fork 之前准备一些内部状态的函数。这应该在调用 fork() 或任何克隆当前进程的类似函数之前调用。仅在定义了 fork() 的系统上可用。

警告

C 语言的 fork() 调用只能从 “主”线程“主”解释器)发起。 PyOS_BeforeFork() 也是如此。

在 3.7 版本加入。

void PyOS_AfterFork_Parent()
自 3.7 版本起,在支持 fork() 的平台上成为 稳定 ABI 的一部分。

在进程 fork 之后更新一些内部状态的函数。这应该在父进程中,在调用 fork() 或任何克隆当前进程的类似函数之后调用,无论进程克隆是否成功。仅在定义了 fork() 的系统上可用。

警告

C 语言的 fork() 调用只能从 “主”线程“主”解释器)发起。 PyOS_AfterFork_Parent() 也是如此。

在 3.7 版本加入。

void PyOS_AfterFork_Child()
自 3.7 版本起,在支持 fork() 的平台上成为 稳定 ABI 的一部分。

在进程 fork 之后更新内部解释器状态的函数。如果进程有可能回调到 Python 解释器,则必须在调用 fork() 或任何克隆当前进程的类似函数之后,在子进程中调用此函数。仅在定义了 fork() 的系统上可用。

警告

C 语言的 fork() 调用只能从 “主”线程“主”解释器)发起。 PyOS_AfterFork_Child() 也是如此。

在 3.7 版本加入。

参见

os.register_at_fork() 允许注册自定义 Python 函数,以便由 PyOS_BeforeFork()PyOS_AfterFork_Parent()PyOS_AfterFork_Child() 调用。

void PyOS_AfterFork()
在支持 fork() 的平台上成为 稳定 ABI 的一部分。

在进程 fork 后更新某些内部状态的函数;如果 Python 解释器将继续使用,则应在新进程中调用此函数。如果新的可执行文件加载到新进程中,则无需调用此函数。

自 3.7 版本弃用: 此函数已被 PyOS_AfterFork_Child() 取代。

int PyOS_CheckStack()
自 3.7 版本起,在支持 USE_STACKCHECK 的平台上成为 稳定 ABI 的一部分。

当解释器耗尽栈空间时返回 true。这是一个可靠的检查,但仅当定义了 USE_STACKCHECK 时才可用(目前在某些使用 Microsoft Visual C++ 编译器的 Windows 版本上)。 USE_STACKCHECK 将自动定义;您不应在自己的代码中更改此定义。

typedef void (*PyOS_sighandler_t)(int)
作为 稳定 ABI 的一部分。
PyOS_sighandler_t PyOS_getsig(int i)
作为 稳定 ABI 的一部分。

返回信号 i 的当前信号处理程序。这是 sigaction()signal() 的一个薄包装器。不要直接调用这些函数!

PyOS_sighandler_t PyOS_setsig(int i, PyOS_sighandler_t h)
作为 稳定 ABI 的一部分。

将信号 i 的信号处理程序设置为 h;返回旧的信号处理程序。这是 sigaction()signal() 的一个薄包装器。不要直接调用这些函数!

wchar_t *Py_DecodeLocale(const char *arg, size_t *size)
自 3.7 版本起成为 稳定ABI 的一部分。

警告

此函数不应直接调用:请使用 PyConfig API 和 PyConfig_SetBytesString() 函数,该函数确保 Python 已预初始化

此函数不得在 Python 预初始化 并且 LC_CTYPE 区域设置正确配置之前调用:请参阅 Py_PreInitialize() 函数。

使用 文件系统编码和错误处理程序 解码字节字符串。如果错误处理程序是 surrogateescape 错误处理程序,则不可解码的字节被解码为 U+DC80..U+DCFF 范围内的字符;如果字节序列可以解码为代理字符,则使用 surrogateescape 错误处理程序而不是解码它们来转义这些字节。

返回指向新分配的宽字符字符串的指针,使用 PyMem_RawFree() 释放内存。如果 size 不是 NULL,则将不包含 null 字符的宽字符数写入 *size

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

文件系统编码和错误处理程序PyConfig_Read() 选择:请参阅 filesystem_encodingfilesystem_errors 的成员 PyConfig

解码错误不应该发生,除非 C 库存在 bug。

使用 Py_EncodeLocale() 函数将字符字符串重新编码为字节字符串。

在 3.5 版本加入。

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

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

char *Py_EncodeLocale(const wchar_t *text, size_t *error_pos)
自 3.7 版本起成为 稳定ABI 的一部分。

将宽字符字符串编码为 文件系统编码和错误处理程序。如果错误处理程序是 surrogateescape 错误处理程序,则范围 U+DC80..U+DCFF 中的代理字符将转换为字节 0x80..0xFF。

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

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

文件系统编码和错误处理程序PyConfig_Read() 选择:请参阅 filesystem_encodingfilesystem_errors 的成员 PyConfig

使用 Py_DecodeLocale() 函数将字节字符串解码回宽字符字符串。

警告

此函数不得在 Python 预初始化 并且 LC_CTYPE 区域设置正确配置之前调用:请参阅 Py_PreInitialize() 函数。

参见

可比较的函数为 PyUnicode_EncodeFSDefault()PyUnicode_EncodeLocale()

在 3.5 版本加入。

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

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

FILE *Py_fopen(PyObject *path, const char *mode)

fopen() 类似,但 path 是一个 Python 对象,并在出错时设置异常。

path 必须是 str 对象、bytes 对象或 类路径对象

成功时,返回新的文件指针。出错时,设置异常并返回 NULL

文件必须由 Py_fclose() 关闭,而不是直接调用 fclose()

文件描述符创建为不可继承(PEP 446)。

调用者必须具有 已附加的线程状态

在 3.14 版本加入。

int Py_fclose(FILE *file)

关闭由 Py_fopen() 打开的文件。

成功时,返回 0。出错时,返回 EOF 并将 errno 设置为指示错误。在任何一种情况下,对流的任何进一步访问(包括另一次调用 Py_fclose())都会导致未定义的行为。

在 3.14 版本加入。

系统函数

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

PyObject *PySys_GetObject(const char *name)
返回值: 借用引用。 稳定ABI 的一部分。

返回 sys 模块中的对象 name,如果不存在则返回 NULL,不设置异常。

int PySys_SetObject(const char *name, PyObject *v)
作为 稳定 ABI 的一部分。

sys 模块中的 name 设置为 v,除非 vNULL,在这种情况下,将从 sys 模块中删除 name。成功时返回 0,出错时返回 -1

void PySys_ResetWarnOptions()
作为 稳定 ABI 的一部分。

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

自 3.13 版本弃用,将于 3.15 版本移除: 请改为清除 sys.warnoptionswarnings.filters

void PySys_WriteStdout(const char *format, ...)
作为 稳定 ABI 的一部分。

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

format 应将格式化输出字符串的总大小限制在 1000 字节以内——超过 1000 字节后,输出字符串将被截断。特别是,这意味着不应出现无限制的“%s”格式;这些格式应使用“%.<N>s”进行限制,其中 <N> 是一个十进制数字,其计算方式应使 <N> 加上其他格式化文本的最大大小不超过 1000 字节。还要注意“%f”,它对于非常大的数字可以打印数百位数字。

如果发生问题,或 sys.stdout 未设置,则格式化消息将写入真实的(C 级别)stdout

void PySys_WriteStderr(const char *format, ...)
作为 稳定 ABI 的一部分。

PySys_WriteStdout() 相同,但写入 sys.stderrstderr

void PySys_FormatStdout(const char *format, ...)
作为 稳定 ABI 的一部分。

此函数类似于 PySys_WriteStdout(),但使用 PyUnicode_FromFormatV() 格式化消息,并且不将消息截断为任意长度。

在 3.2 版本加入。

void PySys_FormatStderr(const char *format, ...)
作为 稳定 ABI 的一部分。

PySys_FormatStdout() 相同,但写入 sys.stderrstderr

在 3.2 版本加入。

PyObject *PySys_GetXOptions()
返回值: 借用引用. 自 3.7 版本起成为 稳定 ABI 的一部分.

返回当前 -X 选项的字典,类似于 sys._xoptions。出错时,返回 NULL 并设置异常。

在 3.2 版本加入。

int PySys_Audit(const char *event, const char *format, ...)
自 3.13 版本起成为 稳定 ABI 的一部分。

使用任何活动的钩子引发审计事件。成功时返回零,失败时返回非零并设置异常。

event 字符串参数不得为 NULL

如果添加了任何钩子,format 和其他参数将用于构造一个元组以传递。除了 NPy_BuildValue() 中使用的相同格式字符均可用。如果构建的值不是元组,它将被添加到单个元素的元组中。

不得使用 N 格式选项。它会消耗一个引用,但由于无法知道此函数的参数是否会被消耗,使用它可能会导致引用泄漏。

请注意,无论是否定义了 PY_SSIZE_T_CLEAN# 格式字符都应始终被视为 Py_ssize_t

sys.audit() 从 Python 代码执行相同的功能。

另请参阅 PySys_AuditTuple()

在 3.8 版本加入。

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

int PySys_AuditTuple(const char *event, PyObject *args)
自 3.13 版本起成为 稳定 ABI 的一部分。

类似于 PySys_Audit(),但将参数作为 Python 对象传递。args 必须是 tuple。要不传递参数,args 可以是 NULL

在 3.13 版本加入。

int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)

将可调用 hook 添加到活动审计钩子列表的末尾。成功时返回零,失败时返回非零。如果运行时已初始化,则在失败时也设置错误。通过此 API 添加的钩子将对运行时创建的所有解释器调用。

userData 指针被传递到钩子函数中。由于钩子函数可能从不同的运行时调用,因此此指针不应直接引用 Python 状态。

此函数在 Py_Initialize() 之前调用是安全的。在运行时初始化后调用时,会通知现有审计钩子,它们可以通过引发 Exception 的子类来静默中止操作(其他错误将不会被静默)。

钩子函数始终由引发事件的 Python 解释器以 已附加的线程状态 调用。

有关审计的详细描述,请参阅 PEP 578。运行时和标准库中引发事件的函数列在 审计事件表 中。详细信息在每个函数的文档中。

如果解释器已初始化,此函数会引发一个不带参数的审计事件 sys.addaudithook。如果任何现有钩子引发派生自 Exception 的异常,则不会添加新钩子,并且异常将被清除。因此,调用者不能假定已添加其钩子,除非他们控制所有现有钩子。

typedef int (*Py_AuditHookFunction)(const char *event, PyObject *args, void *userData)

钩子函数的类型。 event 是传递给 PySys_Audit()PySys_AuditTuple() 的 C 字符串事件参数。 args 保证是 PyTupleObjectuserData 是传递给 PySys_AddAuditHook() 的参数。

在 3.8 版本加入。

进程控制

void Py_FatalError(const char *message)
作为 稳定 ABI 的一部分。

打印致命错误消息并终止进程。不执行任何清理。此函数只应在检测到可能导致继续使用 Python 解释器不安全的情况时调用;例如,当对象管理似乎已损坏时。在 Unix 上,会调用标准 C 库函数 abort(),它将尝试生成一个 core 文件。

除非定义了 Py_LIMITED_API 宏,否则 Py_FatalError() 函数将替换为一个自动记录当前函数名称的宏。

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

void Py_Exit(int status)
作为 稳定 ABI 的一部分。

退出当前进程。此函数会调用 Py_FinalizeEx(),然后调用标准 C 库函数 exit(status)。如果 Py_FinalizeEx() 指示错误,则退出状态将设置为 120。

在 3.6 版本更改: 不再忽略最终化中的错误。

int Py_AtExit(void (*func)())
作为 稳定 ABI 的一部分。

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

参见

PyUnstable_AtExit() 用于传递 void *data 参数。