小编ski*_*ell的帖子

当从C++应用程序中的嵌入式Python调用时,Numpy导入在多数组扩展库上失败

我正在运行一个C++应用程序,它尝试使用https://docs.python.org/3.5/extending/embedding.html函数调用来运行python .这是应用程序错误消息管道给我的错误.

class'ImportError':导入多阵列numpy扩展模块失败.您很可能正在尝试导入失败的numpy版本.如果您正在使用numpy git repo,请尝试git clean -xdf(删除不受版本控制的所有文件).否则重新安装numpy.

原始错误是:/usr/local/lib/python3.5/site-packages/numpy/core/multiarray.cpython-35m-x86_64-linux-gnu.so:undefined symbol:PyExc_UserWarning

我很困惑,因为只有当我在C++中嵌入Python时才会出现这种情况,因为当我通过解释器使用它时导入工作.我对答案更感兴趣,这个答案增加了我的理解,而不是快速做到这一点或做了那个修复.我列出了下面的一些系统/问题信息,以及我正在考虑发布关于同一主题的一些其他问题.任何指导表示赞赏!

系统/问题信息:

  • Ubuntu 16.04,64位
  • 使用enabled-shared编译的Python 3.5.5
  • numpy导入在解释器中工作(python3.exe和python3.5.exe)
  • 我已经确定了PySys_SetPath()设置相同的sys.path从翻译的输出:import sys,sys.path
  • 我可以导入其他模块,如PIL和datetimeutil; 然而,numpy和pandas是不可导入的(熊猫使用numpy或似乎)
  • 嵌入式Python使用下面的命令:Py_Import_Import(),Py_Initialize()(我确信它只能调用一次.)等,但它并没有得到解释的全局锁.
  • 该应用程序使用CMake构建系统构建,该系统为我的系统编译MakeFiles.
  • 使用pip3.5 install numpy命令使用pip 9.0.0安装numpy-1.14.2
  • 导致此错误的python脚本有一行:import numpy...
  • 我没有我要导入文件的.zip文件.
  • 嵌入在C++中的Python使用的.exe位于/ usr/local/bin/python3(使用Py_GetProgramName()来确定这一点).此.exe链接到libpython3.5m.so.1.0,缺少的符号位于libpython3.5m.so.1.0(运行nm)
  • ldd on multiarray.cpython-35m-x86_64-linux-gnu.so显示:

    ldd multiarray.cpython-35m-x86_64-linux-gnu.so

    linux-vdso.so.1 =>(0x00007ffd9e36b000)

    libopenblasp-r0-39a31c03.2.18.so => /usr/local/lib/python3.5/site-packages/numpy/core/./../.libs/libopenblasp-r0-39a31c03.2.18.so(0x00007fdbe149b000)

    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6(0x00007fdbe1192000)

    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0(0x00007fdbe0f75000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6(0x00007fdbe0bab000)/ lib64 /ld-linux-x86-64.so.2(0x00007fdbe3ed5000)

    libgfortran-ed201abd.so.3.0.0 => /usr/local/lib/python3.5/site-packages/numpy/core/./../.libs/libgfortran-ed201abd.so.3.0.0(0x00007fdbe08b1000)

我可以/可能会尝试通过不同的方式重新安装numpy,但我无法跟踪为什么这可能会起作用.

在这一点上,我假设我的知识存在一些漏洞.我已经看过很多关于在C++中嵌入Python时无法导入多阵列组件和numpy的类似帖子; 但是,要么它们都不符合我的具体情况,要么就像我说的那样存在漏洞.以下是我可能会问的一个子问题列表,如果没有人在这个设置中看到任何明显有关的内容.如果我问他们(在我擦亮之后),我可能会用链接更新问题.

  • numpy multiarray.so如何链接到pythonX.X.so以进行符号解析?ldd似乎没有暗示它曾经做过.在这个链接上问这个问题
  • 在这个解决问题的CMake不相关的问题的问题问及18年4月12日,并回答了在18年4月16日.
  • 在.bashrc中设置PYTHONPATH似乎不会更新Py_GetPath()返回的内容,我不得不通过与sys.path不同的方法在site-packages中添加导入.它可能只更新不影响C++的bash脚本环境变量. …

c++ python numpy python-embedding python-3.x

11
推荐指数
1
解决办法
817
查看次数

如何将libpythonX.X中包含的符号链接到numpy扩展动态库?

我目前遇到一个问题,我可以numpy在解释器环境中使用和导入,但我无法导入或使用numpy嵌入的python C/C++.所以我很好奇如何numpy扩展库

numpy/core/multiarray.cpython-35m-x86_64-linux-gnu.so
Run Code Online (Sandbox Code Playgroud)

链接到标准的python包符号(PyExc_UserWarning具体为符号).我当前的错误输出说明了PyExc_UserWarning is undefined.libpythonX.Y.m.so当我使用nm命令确认时,此符号存在.我跑了

ldd multiarray.cpython-35m-x86_64-linux-gnu.so
Run Code Online (Sandbox Code Playgroud)

得到以下输出:

控制台输出

在我看来,这个库没有链接到应该包含该符号的任何动态库.怎样numpymultiarray.cpython-35m-x86_64-linux-gnu.so通常会发现,符号或者多阵列的变化发现,象征?

感谢您抽出宝贵的时间阅读这个问题.任何想法,建议或答案都表示赞赏!

原来的问题就在这里.这是原始问题的一个子问题.我之所以提出这个问题是因为我怀疑这个共享库可能链接到了错误的位置,而这个特定的共享库只在通过python C/C++接口调用python时使用.

系统规格+问题信息

  • Ubuntu 16.04,64位
  • 使用enabled-shared编译的Python 3.5.5
  • 使用pip3.5 install numpy命令使用pip 9.0.0安装numpy-1.14.2

编辑4/16/18:

修改了一些不清楚的术语.

编辑4/17/18:

我找到了原始问题的答案; 然而,这个问题和原始问题仍然是开放的,因为这个问题的答案可以为原始问题找到更好的答案.

c++ python numpy shared-libraries python-3.x

9
推荐指数
1
解决办法
252
查看次数