我有一个嵌入python2和python3解释器的程序。libpython共享库由相应的命令dlopen()
编辑,这些命令提供对解释器的访问,并且每个解释器都维护自己的状态。
如果用户只使用纯python模块或内置函数,那么这一切都可以正常工作。尝试加载C扩展(如termios),然后抱怨“未定义的符号:PyExc_TypeError”。这是因为C扩展没有链接到libpython。Python upstream不认为这是一个problem。
为了解决这个问题,我可以更改程序中的dlopen()
调用,让libpython共享库使用RTLD_GLOBAL
。然而,一旦我这样做,在程序的同一个会话中同时使用python2和python3解释器,就会导致它在调用Py_Initialize
的过程中ABRT,无论哪个解释器是第二次调用的。只用一个口译员就行了。
如果C扩展不与libpython链接,因此需要使用RTLD_GLOBAL
,那么如何让它工作呢?
最佳答案
抱歉,但这不会按你所希望的方式进行。解决方案通常涉及将每个扩展链接到版本化的libpython符号;或者可以有一个支持名称空间的链接器,这样可以将每个库映射到不同的名称空间,而不是全局名称空间。不幸的是,这两个选项都不容易应用,所以您可能会陷入多进程模型的困境。只需fork并有一个指向每个Python版本的进程链接。那么,困难的一点是如何共享任何导致您首先需要两个不同的Python解释器的数据。也许对导致问题的问题的描述有助于找到更好的解决方案?