操作系统实用程序 — Python 文档

来自菜鸟教程
Python/docs/3.8/c-api/sys
跳转至:导航、​搜索

操作系统实用程序

PyObject *PyOS_FSPath(PyObject *path)

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

3.6 版中的新功能。

int Py_FdIsInteractive(FILE *fp, const char *filename)
如果名称为 filename 的标准 I/O 文件 fp 被视为交互式,则返回 true(非零)。 对于 isatty(fileno(fp)) 为真的文件就是这种情况。 如果全局标志 Py_InteractiveFlag 为真,如果 filename 指针为 NULL 或名称等于字符串 '<stdin>''???'
void PyOS_BeforeFork()

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

警告

C fork() 调用只能从 “主”线程“主”解释器)进行。 PyOS_BeforeFork() 也是如此。

3.7 版中的新功能。

void PyOS_AfterFork_Parent()

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

警告

C fork() 调用只能从 “主”线程“主”解释器)进行。 PyOS_AfterFork_Parent() 也是如此。

3.7 版中的新功能。

void PyOS_AfterFork_Child()

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

警告

C fork() 调用只能从 “主”线程“主”解释器)进行。 PyOS_AfterFork_Child() 也是如此。

3.7 版中的新功能。

也可以看看

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

void PyOS_AfterFork()

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

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

int PyOS_CheckStack()
当解释器用完堆栈空间时返回 true。 这是一个可靠的检查,但仅在定义了 USE_STACKCHECK 时才可用(目前在使用 Microsoft Visual C++ 编译器的 Windows 上)。 USE_STACKCHECK 会自动定义; 您永远不应该更改自己代码中的定义。
PyOS_sighandler_t PyOS_getsig(int i)
返回信号 i 的当前信号处理程序。 这是 sigaction()signal() 的薄包装。 不要直接调用那些函数! PyOS_sighandler_tvoid (*)(int) 的 typedef 别名。
PyOS_sighandler_t PyOS_setsig(int i, PyOS_sighandler_t h)
将信号 i 的信号处理程序设置为 h; 返回旧的信号处理程序。 这是 sigaction()signal() 的薄包装。 不要直接调用那些函数! PyOS_sighandler_tvoid (*)(int) 的 typedef 别名。
wchar_t *Py_DecodeLocale(const char *arg, size_t *size)

使用 surrogateescape 错误处理程序 从区域设置编码解码字节字符串:不可解码的字节被解码为范围 U+DC80..U+DCFF 中的字符。 如果字节序列可以解码为代理字符,请使用 surrogateescape 错误处理程序转义字节而不是解码它们。

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

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

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

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

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

  • 当前区域设置编码。

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

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

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

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

3.5 版中的新功能。

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

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

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

使用 surrogateescape 错误处理程序 将宽字符串编码为区域设置:U+DC80..U+DCFF 范围内的代理字符被转换为字节 0x80..0xFF。

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

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

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

  • 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,或者在编码错误时设置为无效字符的索引。

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

3.5 版中的新功能。

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

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


系统功能

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

PyObject *PySys_GetObject(const char *name)
sys模块返回对象name,如果不存在则返回NULL,不设置异常。
int PySys_SetObject(const char *name, PyObject *v)
sys 模块中的 name 设置为 v,除非 vNULL,在这种情况下 name[ X113X] 从 sys 模块中删除。 成功时返回 0,错误时返回 -1
void PySys_ResetWarnOptions()
sys.warnoptions 重置为空列表。 该函数可以在 Py_Initialize() 之前调用。
void PySys_AddWarnOption(const wchar_t *s)
s 附加到 sys.warnoptions。 此函数必须在 Py_Initialize() 之前调用,以影响警告过滤器列表。
void PySys_AddWarnOptionUnicode(PyObject *unicode)

unicode 附加到 sys.warnoptions

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

void PySys_SetPath(const wchar_t *path)
sys.path 设置为在 path 中找到的路径列表对象,它应该是用平台的搜索路径分隔符分隔的路径列表(: 在 Unix 上,[ X175X] 在 Windows 上)。
void PySys_WriteStdout(const char *format, ...)

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

format 应该将格式化输出字符串的总大小限制为 1000 字节或更少——在 1000 字节之后,输出字符串被截断。 特别是,这意味着不应出现不受限制的“%s”格式; 这些应该使用“%. s”在哪里是一个计算出来的十进制数,使得加上其他格式化文本的最大大小不超过 1000 字节。 还要注意“%f”,它可以为非常大的数字打印数百位数字。

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

void PySys_WriteStderr(const char *format, ...)
作为 PySys_WriteStdout(),但改为写入 sys.stderrstderr
void PySys_FormatStdout(const char *format, ...)

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

3.2 版中的新功能。

void PySys_FormatStderr(const char *format, ...)

作为 PySys_FormatStdout(),但改为写入 sys.stderrstderr

3.2 版中的新功能。

void PySys_AddXOption(const wchar_t *s)

s 解析为一组 -X 选项,并将它们添加到 PySys_GetXOptions() 返回的当前选项映射中。 该函数可以在 Py_Initialize() 之前调用。

3.2 版中的新功能。

PyObject *PySys_GetXOptions()

返回 -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[X157X ]。 钩子函数总是使用引发事件的 Python 解释器持有的 GIL 调用。

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

3.8 版中的新功能。


过程控制

void Py_FatalError(const char *message)
打印致命错误消息并终止进程。 不执行清理。 仅当检测到会导致继续使用 Python 解释器变得危险的情况时才应调用此函数; 例如,当对象管理似乎已损坏时。 在 Unix 上,标准 C 库函数 abort() 被调用,它将尝试生成一个 core 文件。
void Py_Exit(int status)

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

在 3.6 版中更改: 不再忽略来自最终确定的错误。

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