在 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进程之间共享?例如,pCryptGenRandom
在 random.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/