File Objects

这些 API 是用于内置文件对象的 Python 2 C API 的最小仿真,该文件过去依赖于 C 标准库中的缓冲 I/O(FILE*)支持。在 Python 3 中,文件和流使用新的io模块,该模块在 os 的低级无缓冲 I/O 上定义了几层。下面描述的Function是这些新 API 的便捷 C 包装器,主要用于解释器中的内部错误报告。建议使用第三方代码访问io API。

  • PyFile_FromFd(int * fd *,const char *name ,const char mode *,int * buffering *,const char *encoding ,const char errors *,const char ** newline *,int * closefd *)
    • 返回值:新参考.

从已经打开的文件* fd 的文件 Descriptors 中创建一个 Python 文件对象。参数 name encoding errors newline *可以是NULL以使用默认值; * buffering 可以是 -1 *以使用默认值。 * name *被忽略,并保持向后兼容。失败时返回NULL。有关参数的更全面描述,请参考io.open()函数文档。

Warning

由于 Python 流具有自己的缓冲层,因此将它们与 OS 级文件 Descriptors 混合会产生各种问题(例如,数据的意外排序)。

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

  • int PyObject_AsFileDescriptor(PyObject ** p *)

    • 返回与* p *关联的文件 Descriptors 作为int。如果对象是整数,则返回其值。如果不存在,则调用该对象的fileno()方法(如果存在);否则,将调用该对象的fileno()方法。该方法必须返回一个整数,该整数作为文件 Descriptors 值返回。设置异常并在失败时返回-1
  • PyObject * PyFile_GetLine(PyObject ** p *,int * n *)

    • 返回值:新参考.

等效于p.readline([n]),此函数从对象* p *读取一行。 * p 可以是文件对象,也可以是具有readline()方法的任何对象。如果 n 0,则仅读取一行,而不管该行的长度如何。如果 n 大于0,将从文件中读取的字节数不超过 n ;可以返回部分行。在这两种情况下,如果立即到达文件末尾,将返回一个空字符串。如果 n *小于0,则无论长度如何都读取一行,但是如果立即到达文件末尾,则引发EOFError

  • int PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction * handler *)
    • 覆盖io.open_code()的常规行为,以pass提供的处理程序传递其参数。

处理程序是PyObject *(*)(PyObject *path, void *userData)类型的函数,其中* path *保证为PyUnicodeObject

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

由于此钩子是在导入期间有意使用的,因此,除非已知它们已冻结或在sys.modules中可用,否则请避免在其执行期间导入新模块。

一旦设置了钩子,就无法将其删除或更换,以后对PyFile_SetOpenCodeHook()的调用将失败。如果失败,该函数将返回-1 并设置一个异常(如果解释器已初始化)。

可以安全地在Py_Initialize()之前调用此函数。

3.8 版的新Function。

  • int PyFile_WriteObject(PyObject *obj PyObject p *,int * flags *)
    • 将对象* obj 写入文件对象 p *。 * flags *支持的唯一标志是Py_PRINT_RAW;如果给出,则写入对象的str()而不是repr()。如果成功则返回0,如果失败则返回-1;将设置适当的 exception。
  • int PyFile_WriteString(const char *s PyObject p *)
    • 将字符串* s 写入文件对象 p *。成功返回0或失败返回-1;将设置适当的 exception。