Python 内置的open()如何映射到它的C实现?
试图解释CPython源代码,并对内置的Python 内置的open()如何映射到它的C实现?,python,c,python-internals,Python,C,Python Internals,试图解释CPython源代码,并对内置的open()方法感到好奇 这个方法是在_pyio.py中定义的,并返回一个FileIO对象,所以我在源代码中查找,发现(在Windows上)有一个对(源代码)的调用。有趣的是,我偶然发现了fileutils.c,其中定义了\u Py\u open,随后定义了\u Py\u open\u impl。后者调用open(源代码),其签名与我假定引用的\u wopen不同;但是,下面有\u Py\u wfopen、\u Py\u fopen和\u Py\u fop
open()
方法感到好奇
这个方法是在_pyio.py中定义的,并返回一个FileIO
对象,所以我在源代码中查找,发现(在Windows上)有一个对(源代码)的调用。有趣的是,我偶然发现了fileutils.c,其中定义了\u Py\u open
,随后定义了\u Py\u open\u impl
。后者调用open
(源代码),其签名与我假定引用的\u wopen
不同;但是,下面有\u Py\u wfopen
、\u Py\u fopen
和\u Py\u fopen\u obj
。它们的注释行似乎表明它们是围绕#include
提供的C函数的包装,因此我知道它们正在调用原始函数并扩展其功能
我无论如何都不是C语言的人,我主要是为了调试而挖掘代码。然而,这让我迷失了方向。所有这些方法(在Windows上)是如何联系在一起的?到目前为止,我已经:
open() -> io.py -> _pyio.py (_io) -> _iomodule.c -> ?
除了在启动文件操作的main.c
中,看不到在哪里显式调用了\u Py\u fopen
或\u Py\u wfopen
(或用于包装库函数)
后者调用open(源代码行),其签名与_wopen不同,我认为它引用的是_wfopen
您的意思不清楚,但对open
的调用引用的是,与Windows无关
open()->io.py->_pyio.py(_io)->_iomodule.c->
_iomodule.c定义了\u io\u open\u impl
,它从fileio.c
实例化PyFileIO\u类型
这实际上是在\u io\u FileIO\uuuuuuuu init\uuuuuuuuuuu impl
中打开一个文件,经过一些摸索之后,它在windows上调用\u wopen
,在别处调用打开(2)
:您看到的是错误的实现。\u pyio.py
中的实现实际上只用于测试,而fileutils.c
的内容也不相关。这是其他东西使用的,而不是Python级别的open
函数。您可以通过运行本机代码调试器并在底层系统调用时中断来获取一些信息。在Linux/x86_64上,系统调用称为open
,文件名是这样的:gdb-ex“break open if((char*)\$rdi)[0]='w''-ex run-ex backtrace--args/usr/bin/python3-c'open(“wibble”)
为open(“wibble”)
提供了本机代码回溯。信息量的大小取决于Python解释器的编译方式。@user2357112supportsMonica它只用于测试是什么意思?当我使用inspect.getmodule(open)
时,它返回io.py。那么内置的open
的实现在哪里呢?如果没有的话?@意大利面酱:它返回io.py
。不\u pyio.py
\u pyio.py
仅用于测试。内置的打开的定义的模块是_iodmodule.c吗?它的序列与_pyio.py中的序列匹配。io模块最初是用纯Python实现的_pyio就是这样,当模块在C中重新实现时,为了性能、内存,…\u pyio
仍然是测试功能的一种方便方式,并且是替代实现的副本(例如,第三方实现可以抓取_pyio并获得一个工作的io模块),pyio在很大程度上被弃用。您通常得到的打开的
内置程序是位于\u iomodule.c
中的程序。