【发布时间】:2011-03-20 05:49:52
【问题描述】:
我有一个嵌入了 python2 和 python3 解释器的程序。 libpython 共享库是dlopen()ed 由各自的命令提供对解释器的访问,并且每个解释器都维护自己的状态。
如果用户只使用纯 python 模块或内置函数,这一切都可以正常工作。尝试加载 C 扩展(如 termios)然后抱怨“未定义的符号:PyExc_TypeError”。发生这种情况是因为 C 扩展没有与 libpython 链接。 Python 上游不认为这是problem。
为了解决这个问题,我可以将程序中的 dlopen() 调用更改为 libpython 共享库以使用 RTLD_GLOBAL。但是,一旦我这样做,尝试在程序的同一会话中同时使用 python2 和 python3 解释器会导致它在调用 Py_Initialize 的过程中为第二个调用的解释器而 ABRT。只使用一个解释器就可以了。
知道当 C 扩展不与 libpython 链接时如何使其工作,因此需要使用 RTLD_GLOBAL?
【问题讨论】: