有一些函数,如print
,嵌入在CPython中,还有其他函数,如os.makedirs
,用外部.py文件(即在os.py
中)编写。
据我所知,print()
会调用已经在CPython中编写的一些C代码,并且C代码将被编译为字节码以供计算机理解。
在os.makedirs
的情况下会发生什么?这并没有嵌入到CPython中,因此CPython对os.makedirs
一无所知。
或者makedirs
是否使用了一些可以追溯到CPython知道的内置对象的对象?
例如,os.py
进口abc.py
进口_weakrefset.py
最终进口内置的_weakref
物体?所以,os.py
可以追溯到内置的_weakref
对象,为此,CPython有一些C代码。
一切都归结为Python中的内置对象吗?这取决于你对问题的意思,但猜测你在谈论代码流,那么答案是否定的。
以python的C实现为基准 - 记住有用Java,C#甚至Python编写的Python版本。模块可以用C或C ++编写,因为有一个API。
创建一个目录(mkdir
)。在某些时候需要内核调用,这取决于操作系统。例如,将有一个Windows和一个UNIX或Posix低级接口来进行内核调用,它几乎肯定会用C编写。这是因为大多数现代操作系统都有C内核API,而不是Python内核。
例如,请参阅Python源代码中的Modules/posixmodule.c
,它是调用OS内核接口mkdir
的地方。用于创建目录的C接口只需要一个文本字符串(不是python str
对象),一个用于权限的C八进制整数,以及一个用于存储其结果的变量。这些必须在C和Python之间进行转换,但是模块内部可以使用其他类型的纯C,并且不需要转换回python。
仅仅因为模块是用C编写的并不意味着它是内置的(builtin
模块的一部分)。你可以编写自己的C模块并从python中调用它 - python用户不需要知道它所写的语言,通常是不可见的。