我使用的是一个python包装的C++库。在它的__init__.py文件中,在导入包含实现代码的共享对象文件之前,它会集合 dlopen标志RTLD_GLOBAL。
这会导致随后的scipy.linalg导入分段错误,至少在我的机器上是这样。我认为这种行为取决于枕木的建造方式和与之相关的东西。
# 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.pysys.setdlopenflags(flags | ctypes.RTLD_GLOBAL)行时,库似乎一切正常,所以这可能是特定于某些python版本或平台的?发布于 2014-01-13 16:53:38
您正在f2py工具中碰到一个bug,该工具用于构建SciPy。请参阅这里的详细信息:https://github.com/numpy/numpy/issues/2521
不幸的是,您只能通过重新构建SciPy或删除RTLD_GLOBAL标志来解决问题。
正在发生的事情是,NumPy和SciPy都在使用符号PyArray_API,RTLD_GLOBAL标志迫使SciPy导出自己的副本。这导致了冲突和分段的错误。(如果有人能更详细地解释这件事,我很想知道)
RTLD_GLOBAL使来自共享库的符号公开,并可用于重新定位。当您通过dlopen()导入几个使用彼此符号的单独库时,就需要这样做。在Python中,当单个项目(PyOpenMM)包含几个希望共享其中一个项目提供的公共功能的二进制子模块时,就会出现这种情况。“一切看起来都很好”这一事实可能仅仅意味着您没有使用任何需要共享功能的东西--或者PyOpenMM实际上不再需要这样的功能了。
https://stackoverflow.com/questions/20849755
复制相似问题