【发布时间】:2013-12-31 00:16:25
【问题描述】:
我使用 python swig 包装的 C++ 库。在它的__init__.py 文件中,它sets dlopen 标志RTLD_GLOBAL 在导入包含实现代码的共享对象文件之前。
这会导致后续导入 scipy.linalg 到段错误,至少在我的机器上是这样。我认为这种行为取决于 scipy 的构建方式以及与之相关的内容。
# minimal example of what's going on
$ cat test.py
import sys
import ctypes
flags = sys.getdlopenflags()
sys.setdlopenflags(flags | ctypes.RTLD_GLOBAL)
import scipy.linalg
$ python test.py
[1] 16886 segmentation fault (core dumped) python test.py
- 为什么会发生这种情况?发生了什么事?
- 在什么条件下可能需要设置 RTLD_GLOBAL?我使用的代码包含 comment "# 以下是允许 POSIX "dlopen" 函数工作所需的邪恶咒语。我不明白。如果知道更好的解决方案,请转发PyOpenMM 代码维护者。”当我删除
sys.setdlopenflags(flags | ctypes.RTLD_GLOBAL)行时,该库似乎一切正常,所以这可能是特定于某些 python 版本或平台的?
【问题讨论】:
标签: python numpy scipy shared-libraries python-import