我目前在使用和导入时遇到问题numpy
在解释器环境中,但我无法导入或使用numpy
来自嵌入的PythonC/C++
。所以我很好奇如何numpy
扩展库,特别是
numpy/core/multiarray.cpython-35m-x86_64-linux-gnu.so
链接到标准 python 包符号 (PyExc_UserWarning
具体符号)。我当前的错误输出表明PyExc_UserWarning is undefined
。该符号存在于libpythonX.Y.m.so
正如我确认使用nm
命令。我跑了
ldd multiarray.cpython-35m-x86_64-linux-gnu.so
并得到以下输出:
在我看来,该库并未链接到任何应包含该符号的动态库。如何numpy
's multiarray.cpython-35m-x86_64-linux-gnu.so
通常会找到该符号或多数组的变体找到该符号?
感谢您抽出宝贵时间阅读这个问题。任何想法、建议或答案都值得赞赏!
原问题位于。这是原始问题的子问题。我之所以问这个问题是因为我怀疑这个共享库可能链接到了错误的位置,并且这个特定的共享库仅在通过 python 调用 python 时使用C/C++
接口。
系统规格+问题信息
- Ubuntu 16.04,64 位
- 编译Python 3.5.5并启用共享
- 使用 pip 9.0.0 安装了 numpy-1.14.2
pip3.5 install numpy
command
2018 年 4 月 16 日编辑:
修改了一些不清楚的术语。
2018 年 4 月 17 日编辑:
我找到了原来问题的答案;然而,这个问题和原来的问题仍然悬而未决,因为这个问题的答案可能会为问题带来更好的答案原来的问题 https://stackoverflow.com/questions/49784583/numpy-import-fails-on-multiarray-extension-library-when-called-from-embedded-pyt.
multiarray.cpython-35m-x86_64-linux-gnu.so
是在没有与 python 动态库显式链接的情况下构建的,这就是为什么您无法使用 ldd 看到 libpythonx.x.x 的原因。
如果您使用 nm 来检查这一点,您将看到该符号PyExc_UserWarning
未定义。
因此,当 numpy 使用 dlopen 加载它时,它会尝试解析这个未定义的符号。我没有找到任何文件解释规则如何libdl.so
解决未定义的符号。但根据我的测试,当你尝试打开共享库时使用dlopen
有旗帜RTLD_NOW
,它会在主程序的依赖共享库中查找未定义的符号。
这可以解释为什么 python 可以毫无错误地使用它,因为 python 二进制文件与libpython.x.x.so
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)