python - Python(c)源代码如何编译成共享库

标签 python c python-2.7

在 Python 2.7 中 README文件,上面写着

Starting with Python 2.3, the majority of the interpreter can be built into a shared library, which can then be used by the interpreter executable

我想知道 pystate.c 中的以下全局变量被编译成共享库还是可执行文件?

static PyInterpreterState *interp_head = NULL;

PyThreadState *_PyThreadState_Current = NULL;

顺便问一下,如果这样的全局(静态)变量被编译到共享库中,这些状态是否会在不同的Python进程之间共享?例如,pCryptGenRandomrandom.c

最佳答案

这两个符号都存在于共享库的零初始化段中:

% nm /usr/lib/x86_64-linux-gnu/libpython2.7_d.so|egrep '(interp_head|_PyThreadState_Current)'
000000000062a230 b interp_head
000000000062a208 B _PyThreadState_Current

interp_head 是一个静态变量 - 没有外部链接的变量 - 并且在模块外部不可见。 _PyThreadState_Current 具有外部链接,并且对使用共享库的程序可见:

% objdump -TC /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 | \
   egrep 'interp_head|_PyThreadState_Current'
000000000056d3c0 g    DO .bss   0000000000000008  Base        _PyThreadState_Current

(外部符号表中仅列出_PyThreadState_Current)。

<小时/>

每个进程都会有一组单独的全局变量;这些不在 Python 进程之间共享。

关于python - Python(c)源代码如何编译成共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43444569/

相关文章:

python - 带有键/值类型对的类型提示字典

嵌套 for 循环的复杂性

python-2.7 - 导入错误;没有名为 Quandl 的模块

Python 不显示类中打印语句的结果

python-2.7 - 在 Python 中简单地从 USB HID 设备读取/写入?

python - 如何从未命名的 :0 to columns with increment number in python 重命名列

python - 按特定单词和字母顺序排序

c - 从多项式中提取幂

c - 在 C 中使用 free() 时出现问题

python - 在 Python 中将列表与其索引和内容进行比较