问题描述
试图推理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