python - 在 CPython 中,Py_Main 的范围在哪里?

标签 python c implementation cpython

我一直在查看 CPython 源代码,其中 python.h 为大多数模块导入。仅通过跟踪代码,我找不到将 Py_Main() 例程放入范围的点。

我确实在 Modules/main.c 中找到了 Py_Main 的定义,以及 include/pylifecycle.h 中的原型(prototype),我似乎无法拼凑它是从哪里导入的,或者是否是在链接器级别使用 make 完成的。

长篇大论: #include "python.h"Py_Main 现在在范围内...它是在什么时候注入(inject)的?

最佳答案

Py_Mainpylifecycle.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/

相关文章:

python - Python 中如何进行位运算?

c - 为什么从 Linux 模块读取可以逐字符读取,但不能读取整个字符串

c - 如何将结构映射为共享匿名内存?

c - 打印函数变量时打印输出不同

python - 检查我对哈希表的理解

python - 如何在 Django Python 中使用检测意图(文本)?

python - 在 wxpython 中单击按钮后如何禁用按钮?

python - 如何从大型数据集中提取每天每小时的 500 个条目?

Haskell - 实现和实例

oracle - 有人能解释一下 MERGE 语句在 Oracle 中的真正作用吗?