我一直在查看 CPython 源代码,其中 python.h
为大多数模块导入。仅通过跟踪代码,我找不到将 Py_Main()
例程放入范围的点。
我确实在 Modules/main.c
中找到了 Py_Main
的定义,以及 include/pylifecycle.h
中的原型(prototype),我似乎无法拼凑它是从哪里导入的,或者是否是在链接器级别使用 make
完成的。
长篇大论:
#include "python.h"
,Py_Main
现在在范围内...它是在什么时候注入(inject)的?
最佳答案
Py_Main
在 pylifecycle.h
中声明:
PyAPI_FUNC(int) Py_Main(int argc, wchar_t **argv);
pylifecycle.h
包含在 Python.h
中:
#include "pylifecycle.h"
每当您编写 #include "Python.h"
时,pylifecycle.h
都会自动包含在内,您会得到 Py_Main
。
这是关于函数声明的,现在它的代码呢?
对于 CPython 本身:
构建 Python 时,Python
directory 中的每个 .c
文件由 C 编译器编译成目标文件 (.o
)。然后对象文件是statically linked一起成为一个独立的可执行文件。在 Linux 上,通常的链接器是 GNU ld .
对于第三方模块:
对于想要使用 Python API 的模块,Py_Main
的代码不包括在内:它在运行时由 dynamic linker 加载.
在 Linux 上(类似地,在其他系统上)编译后的 Python 代码以两种方式发布:作为独立的可执行文件 python
,以及作为共享库 python.so
。两者都包含 Py_Main
和所有其他函数的代码。
关于python - 在 CPython 中,Py_Main 的范围在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47542988/