文件对象

这些API是对内置文件对象的python 2 c API的最小模拟,后者过去依赖于缓冲的I/O (FILE* )来自C标准库的支持。在python 3中,文件和流使用 io 模块,在操作系统的低级无缓冲I/O上定义多个层。下面描述的函数是这些新API的便利C包装器,主要用于解释程序中的内部错误报告;建议第三方代码访问 io 代替API。

PyObject *PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const char *encoding, const char *errors, const char *newline, int closefd)
Return value: New reference.

从已打开文件的文件描述符创建python文件对象 fd . 论点 name编码错误换行符 可以是 NULL 使用默认值; 缓冲 可以是 -1 使用默认值。 name 被忽略并保持向后兼容性。返回 NULL 失败时。有关参数的更全面描述,请参阅 io.open() 功能文档。

警告

因为python流有自己的缓冲层,所以将它们与操作系统级的文件描述符混合会产生各种问题(例如,数据的意外排序)。

在 3.2 版更改: 忽略 name 属性。

int PyObject_AsFileDescriptor(PyObject *p)

返回与关联的文件描述符 p 作为 int . 如果对象是整数,则返回其值。如果没有,对象是 fileno() 如果方法存在,则调用该方法;该方法必须返回一个整数,该整数作为文件描述符值返回。设置异常并返回 -1 失败论。

PyObject *PyFile_GetLine(PyObject *p, int n)
Return value: New reference.

相当于 p.readline([n]) ,此函数从对象中读取一行 p . p 可能是文件对象或具有 readline() 方法。如果 n0 ,不管行的长度如何,只读取一行。如果 n 大于 0 ,只不过 n 将从文件中读取字节;可以返回部分行。在这两种情况下,如果立即到达文件结尾,则返回空字符串。如果 n 小于 0 但是,不管长度如何,都会读取一行,但是 EOFError 如果立即到达文件结尾,则引发。

int PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction handler)

覆盖的正常行为 io.open_code() 通过提供的处理程序传递其参数。

处理程序是类型的函数 PyObject *(*)(PyObject *path, void *userData) 在哪里 path 保证 PyUnicodeObject .

这个 用户数据 指针被传递到hook函数中。由于钩子函数可以从不同的运行时调用,所以该指针不应该直接引用Python状态。

由于这个钩子是在导入过程中故意使用的,所以在执行过程中避免导入新模块,除非知道它们被冻结或在 sys.modules .

一旦设置了钩子,就不能移除或替换钩子,稍后调用 PyFile_SetOpenCodeHook() 会失败的。失败时,函数返回-1,如果解释器已初始化,则设置异常。

此函数在调用之前是安全的 Py_Initialize() .

引发一个 auditing event setopencodehook 没有任何争论。

3.8 新版功能.

int PyFile_WriteObject(PyObject *obj, PyObject *p, int flags)

写入对象 obj 文件对象 p . 唯一支持的标志 flagsPy_PRINT_RAW 如果给予的话, str() 而不是 repr() . 返回 0 关于成功还是 -1 失败时;将设置适当的异常。

int PyFile_WriteString(const char *s, PyObject *p)

写入字符串 s 文件对象 p . 返回 0 关于成功还是 -1 失败时;将设置适当的异常。