osUtil

返回* path *的文件系统表示形式。如果对象是strbytes对象,则其引用计数将增加。如果对象实现os.PathLike接口,则只要它是strbytes对象,就返回fspath()。否则,将引发TypeError并返回NULL

3.6 版的新Function。

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

    • 如果名称为* filename 的标准 I/O 文件 fp 被认为是交互式的,则返回 true(非零)。对于isatty(fileno(fp))为 true 的文件就是这种情况。如果全局标志Py_InteractiveFlag为 true,则如果 filename *指针为NULL或名称等于字符串'<stdin>''???'之一,则此函数也返回 true。
  • 无效PyOS_BeforeFork()

    • 在流程派生之前准备一些内部状态的Function。在调用fork()或克隆当前进程的任何类似函数之前,应先调用此函数。仅在定义了fork()的系统上可用。

Warning

C fork()调用只能从"main" interpreter"main" thread进行。 PyOS_BeforeFork()也是如此。

3.7 版中的新Function。

  • 无效PyOS_AfterFork_Parent()
    • 在流程派生后更新某些内部状态的Function。在调用fork()或任何类似的克隆当前进程的函数之后,无论进程克隆是否成功,都应从父进程中调用它。仅在定义了fork()的系统上可用。

Warning

C fork()调用只能从"main" interpreter"main" thread进行。 PyOS_AfterFork_Parent()也是如此。

3.7 版中的新Function。

  • 无效PyOS_AfterFork_Child()
    • 在流程派生后更新内部解释器状态的函数。必须在调用fork()或克隆当前进程的任何类似函数之后从子进程中调用该函数,如果该进程有可能会回调回 Python 解释器中。仅在定义了fork()的系统上可用。

Warning

C fork()调用只能从"main" interpreter"main" thread进行。 PyOS_AfterFork_Child()也是如此。

3.7 版中的新Function。

See also

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

  • 无效PyOS_AfterFork()
    • 在流程派生后更新某些内部状态的Function;如果将 continue 使用 Python 解释器,则应在新过程中调用此方法。如果将新的可执行文件加载到新进程中,则不需要调用此函数。

从 3.7 版开始不推荐使用:PyOS_AfterFork_Child()取代了此Function。

  • int PyOS_CheckStack()

    • 当解释器的堆栈空间不足时,返回 true。这是可靠的检查,但仅在定义USE_STACKCHECK时可用(当前在 Windows 上使用 Microsoft Visual C 编译器)。 USE_STACKCHECK将被自动定义;您永远不要在自己的代码中更改定义。
  • PyOS_sighandler_t PyOS_getsig(int * i *)

    • 返回 signal* i *的当前 signal 处理程序。这是围绕sigaction()signal()的薄包装。不要直接调用这些Function! PyOS_sighandler_tvoid (*)(int)的 typedef 别名。
  • PyOS_sighandler_t PyOS_setsig(int * i *,PyOS_sighandler_t * h *)

    • 将 signal* i 的 signal 处理程序设置为 h *;返回旧的 signal 处理程序。这是围绕sigaction()signal()的薄包装。不要直接调用这些Function! PyOS_sighandler_tvoid (*)(int)的 typedef 别名。
  • wchar_t * Py_DecodeLocale(const char * * arg *,size_t ** size *)

    • 使用surrogateescape 错误处理程序从语言环境编码中解码字节字符串:无法解码的字节将解码为 U DC80..U DCFF 范围内的字符。如果可以将字节序列解码为替代字符,请使用替代错误处理程序对字节进行转义,而不是对其进行解码。

编码,从最高优先级到最低优先级:

  • UTF-8在 macOS,Android 和 VxWorks 上;

  • 如果Py_LegacyWindowsFSEncodingFlag为零,则在 Windows 上为UTF-8

  • UTF-8如果启用了 Python UTF-8 模式;

  • ASCII如果LC_CTYPE语言环境为"C",则nl_langinfo(CODESET)返回ASCII编码(或别名),并且mbstowcs()wcstombs()函数使用ISO-8859-1编码。

  • 当前的语言环境编码。

返回指向新分配的宽字符串的指针,使用PyMem_RawFree()释放内存。如果 size 不是NULL,请将除空字符之外的宽字符数写入*size

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

除非 C 库中存在错误,否则永远不会发生解码错误。

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

3.5 版中的新Function。

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

在版本 3.8 中更改:现在,如果Py_LegacyWindowsFSEncodingFlag为零,则该函数在 Windows 上使用 UTF-8 编码;

  • char * Py_EncodeLocale(const wchar_t *text ,size_t error_pos *)

编码,从最高优先级到最低优先级:

  • UTF-8在 macOS,Android 和 VxWorks 上;

  • 如果Py_LegacyWindowsFSEncodingFlag为零,则在 Windows 上为UTF-8

  • UTF-8如果启用了 Python UTF-8 模式;

  • ASCII如果LC_CTYPE语言环境为"C",则nl_langinfo(CODESET)返回ASCII编码(或别名),并且mbstowcs()wcstombs()函数使用ISO-8859-1编码。

  • 当前的语言环境编码。

该函数在 Python UTF-8 模式下使用 UTF-8 编码。

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

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

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

3.5 版中的新Function。

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

在版本 3.8 中更改:现在,如果Py_LegacyWindowsFSEncodingFlag为零,则该函数在 Windows 上使用 UTF-8 编码;

System Functions

这些是 Util 函数,这些函数使sys模块的Function可用于 C 代码。它们都与当前解释器线程的sys模块的字典一起工作,该字典包含在内部线程状态结构中。

  • PyObject * PySys_GetObject(const char ** name *)
    • *返回值:借用参考。

sys模块或NULL(如果不存在)返回对象* name *,而不设置异常。

  • int PySys_SetObject(const char *name PyObject v *)

    • 除非** v NULL,否则将sys模块中的 name 设置为 v ,在这种情况下,将从 sys 模块中删除 name *。成功返回0,错误返回-1
  • 无效PySys_ResetWarnOptions()

  • 无效PySys_AddWarnOption(const wchar_t ** s *)

  • 无效PySys_AddWarnOptionUnicode(PyObject ** unicode *)

注意:此函数目前无法从 CPython 实现中使用,因为必须在Py_Initialize()隐式导入warnings之前调用此函数才能生效,但必须在初始化足够的运行时以允许创建之前调用此函数 Unicode 对象。

  • 无效PySys_SetPath(const wchar_t ** path *)

    • sys.path设置为在* path *中找到的路径的列表对象,该对象应该是用平台的搜索路径定界符(Unix 上为:,Windows 上为;)分隔的路径的列表。
  • 无效PySys_WriteStdout(const char ** format *,...)

    • 将* format *描述的输出字符串写入sys.stdout。即使发生截断,也不会引发异常(请参见下文)。
  • format *应该将格式化输出字符串的总大小限制为 1000 字节或更小-1000 字节后,输出字符串将被截断。特别是,这意味着不应出现任何不受限制的“%s”格式;这些值应使用“%。 s”进行限制,其中是计算得出的十进制数,以使加上其他格式化文本的最大大小不超过 1000 个字节。还要注意“%f”,它可以打印数百位的非常大的数字。

如果出现问题,或者未设置sys.stdout,则格式化的消息将被写入实数(C 级)* stdout *。

  • 无效PySys_WriteStderr(const char ** format *,...)

  • 无效PySys_FormatStdout(const char ** format *,...)

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

3.2 版中的新Function。

3.2 版中的新Function。

  • 无效PySys_AddXOption(const wchar_t ** s *)

3.2 版中的新Function。

  • PyObject * PySys_GetXOptions ( )
    • *返回值:借用参考。

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

3.2 版中的新Function。

  • int PySys_Audit(const char *event ,const char format *,...)
    • 使用任何活动的钩子引发审核事件。如果成功则返回零,失败则返回零。

如果添加了任何钩子,则* format *和其他参数将用于构造要传递的 Tuples。除N以外,还提供与Py_BuildValue()中使用的相同格式字符。如果构建的值不是 Tuples,则将其添加到单元素 Tuples 中。 (N format 选项使用一个引用,但是由于无法知道是否将使用此函数的参数,因此使用它可能会导致引用泄漏.)

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

sys.audit()pass Python 代码执行相同的Function。

3.8 版的新Function。

在版本 3.8.2 中更改:#格式字符要求Py_ssize_t。以前,提出了不可避免的弃用警告。

  • int PySys_AddAuditHook(Py_AuditHookFunction * hook *,void ** userData *)
    • 将可调用的* hook *附加到活动审核钩子列表中。成功返回零,失败返回非零。如果运行时已初始化,则还要在失败时设置错误。pass此 API 添加的钩子将针对运行时创建的所有解释器进行调用。
  • userData *指针被传递到钩子函数中。由于可以从不同的运行时调用钩子函数,因此该指针不应直接引用 Python 状态。

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

钩子函数的类型为int (*)(const char *event, PyObject *args, void *userData),其中* args *保证为PyTupleObject。始终使用引发事件的 Python 解释器持有的 GIL 来调用 hook 函数。

有关审核的详细说明,请参见 PEP 578审核事件表中列出了引发事件的运行时和标准库中的函数。详细信息在每个Function的文档中。

如果解释器已初始化,则此函数将引发不带参数的审核事件sys.addaudithook。如果任何现有的钩子引发了从Exception派生的异常,则不会添加新的钩子,并且将清除该异常。如此一来,除非调用者控制所有现有的钩子,否则无法假定他们的钩子已添加。

3.8 版的新Function。

Process Control

  • 无效Py_FatalError(const char ** message *)
    • 打印致命错误消息并终止进程。不执行清理。仅当检测到可能会 continue 使用 Python 解释器的危险的条件时,才应调用此函数。例如,当对象 Management 似乎已损坏时。在 Unix 上,将调用标准 C 库函数abort(),它将try生成core文件。
  • 无效Py_Exit(int 状态)
    • 退出当前进程。这将调用Py_FinalizeEx(),然后调用标准 C 库函数exit(status)。如果Py_FinalizeEx()指示错误,则退出状态设置为 120.

在版本 3.6 中更改:终结处理中的错误不再被忽略。

  • int Py_AtExit(void(** func *)())
    • 注册一个由Py_FinalizeEx()调用的清理函数。清理函数将不带任何参数调用,并且不返回任何值。最多可以注册 32 个清除Function。注册成功后,Py_AtExit()返回0;如果失败,则返回-1。最后注册的清除Function首先被调用。每个清理函数最多被调用一次。由于 Python 的内部完成工作将在 cleanup 函数之前完成,因此* func *不应调用 Python API。