内置的open如何映射到其C实现?

问题描述

试图推理cpython源代码,并对内置的open()方法感到好奇。

方法 _pyio.py 中定义,并返回一个FileIO对象,因此我在源代码中进行了挖掘,发现(在Windows上)有一个_wopen调用(来源line)。有趣的是,我偶然发现了 fileutils.c ,其中定义了_Py_open,随后定义了_Py_open_impl。后者调用open(源line),该签名与我假定引用的_wfopen_wopen具有不同的签名;但是,下面有_Py_wfopen_Py_fopen_Py_fopen_obj。他们的注释行似乎表明它们是#include提供的C函数的包装,因此我知道他们正在调用原始函数并扩展其功能

无论如何我都不是C语言人,大多数情况下我可以挖掘代码进行调试。但是,这让我迷失了。所有这些方法如何结合在一起(在Windows上)?到目前为止,我有

open() -> io.py -> _pyio.py (_io) -> _iomodule.c -> ?

看不到_Py_fopen_Py_wfopen在何处被明确调用(或用于包装库函数),而不是在main.c中用于启动文件操作。

解决方法

后者调用open(源代码行),它的签名与_wopen(我假定引用_wfopen的签名)不同

您的意思不清楚,但对plt.plot(sets[i],'black')的调用引用了unix open(2) syscall,与Windows无关。

open()-> io.py-> _pyio.py(_io)-> _iomodule.c->?

_iomodule.c定义了open,该实例从_io_open_impl实例化了PyFileIO_Type

这实际上是在fileio.c中打开一个文件,经过一番忙碌之后,它仅在Windows上调用_io_FileIO___init___impl,在其他地方https://github.com/python/cpython/blob/master/Modules/_io/fileio.c#L383