gpt4 book ai didi

python - 动态加载两个 libpython 版本

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:06 24 4
gpt4 key购买 nike

我有一个同时嵌入了 python2 和 python3 解释器的程序。 libpython 共享库由提供对解释器的访问权限的相应命令dlopen()编辑,每个解释器维护自己的状态。

如果用户只使用纯 python 模块或内置函数,这一切都可以正常工作。尝试加载 C 扩展(如 termios)然后提示“ undefined symbol :PyExc_TypeError”。发生这种情况是因为 C 扩展没有链接到 libpython。 Python 上游并不认为这是一个 problem .

为了解决这个问题,我可以更改程序中的 dlopen() 调用以使用 RTLD_GLOBAL 的 libpython 共享库。但是,一旦我这样做,尝试在程序的同一 session 中同时使用 python2 和 python3 解释器会导致它在为第二个调用的解释器调用 Py_Initialize 的过程中中断。仅使用一名口译员就可以正常工作。

当 C 扩展不会链接到 libpython,因此需要使用 RTLD_GLOBAL 时,知道如何让它工作吗?

最佳答案

抱歉,这不会按照您希望的方式工作。解决方案通常涉及将每个扩展链接到版本化的 libpython 符号;或者可以有一个支持 namespace 的链接器,这样就可以将每个库映射到不同的 namespace ,而不是全局 namespace 。不幸的是,这两个选项都不容易应用,因此您可能受困于多进程模型。简单地 fork 并有一个进程链接到每个版本的 Python。那么困难的一点是如何共享任何导致您首先需要两个不同的 Python 解释器的数据。也许对导致问题的问题的描述可能有助于找到更好的解决方案?

关于python - 动态加载两个 libpython 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3320742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com