【问题标题】:In CPython, where does Py_Main get put in scope?在 CPython 中,Py_Main 的作用域是什么?
【发布时间】:2017-11-29 00:06:20
【问题描述】:

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

我确实在Modules/main.c 中找到了Py_Main 的定义,以及include/pylifecycle.h 中的原型,我似乎无法拼凑出它是从哪里导入的,或者如果这是在链接器上完成的与make平级。

TLDR: #include "python.h"Py_Main 现在在作用域内......它是在什么时候被注入那里的?

【问题讨论】:

    标签: python c implementation cpython


    【解决方案1】:

    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 的代码和所有其他函数。

    【讨论】:

    • 我注意到了。但是,实际定义在文件Modules/main.c 中,我在代码中没有看到任何引用。
    • @SamuelN:如果您想知道函数是如何编译和链接的,那与您所问的问题完全不同。
    • @user2357112 是的,这就是为什么我将其包含在我的问题"or if this is done at the linker level with make" 中。感谢您的澄清!
    • @user2357112 还有一个问题。我不熟悉这是如何完成的,并为main.c 尝试了grep,但找不到任何东西。你能给我一些关于在哪里寻找这个链接定义的指导吗?我尝试在cmake 文件以及configure 脚本中进行搜索。
    • @SamuelN:我不清楚您是否对如何构建官方 Python 可执行文件或如何构建第三方模块感兴趣。如果您澄清这一点,我可以扩展我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2015-01-25
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    相关资源
    最近更新 更多