简体   繁体   English

C ++-使用numpy嵌入Python

[英]C++ - Python Embedding with numpy

I would like to call a python function from C++ and get the return value. 我想从C ++调用python函数并获取返回值。 I've been able to do that with an easy multiply python function using this website's example code in section 5.3. 我已经能够使用第5.3节中网站的示例代码通过简单的python乘法来做到这一点 To compile my program, I would run g++ test.cpp -I/usr/include/python2.7 -lpython2.7 . 要编译我的程序,我将运行g++ test.cpp -I/usr/include/python2.7 -lpython2.7 However, the python function I want to run imports numpy. 但是,我要运行的python函数要导入numpy。 When I try to run my program that is similar to the one on the code example mentioned above, I get an "ImportError: cannot import name _remove_dead_weakref". 当我尝试运行与上述代码示例中的程序相似的程序时,出现“导入错误:无法导入名称_remove_dead_weakref”。 The full error is here: 完整的错误在这里:

Traceback (most recent call last):
  File "/home/osboxes/Desktop/test.py", line 1, in <module>
    import numpy as np 
  File "/home/osboxes/.local/lib/python2.7/site-packages/numpy/__init__.py", line 142, in <module>
    from . import add_newdocs
  File "/home/osboxes/.local/lib/python2.7/site-packages/numpy/add_newdocs.py", line 13, in <module>
    from numpy.lib import add_newdoc
  File "/home/osboxes/.local/lib/python2.7/site-packages/numpy/lib/__init__.py", line 8, in <module>
    from .type_check import *
  File "/home/osboxes/.local/lib/python2.7/site-packages/numpy/lib/type_check.py", line 11, in <module>
    import numpy.core.numeric as _nx
  File "/home/osboxes/.local/lib/python2.7/site-packages/numpy/core/__init__.py", line 74, in <module>
    from numpy.testing.nosetester import _numpy_tester
  File "/home/osboxes/.local/lib/python2.7/site-packages/numpy/testing/__init__.py", line 10, in <module>
    from unittest import TestCase
  File "/home/osboxes/miniconda2/lib/python2.7/unittest/__init__.py", line 64, in <module>
    from .main import TestProgram, main
  File "/home/osboxes/miniconda2/lib/python2.7/unittest/main.py", line 7, in <module>
    from . import loader, runner
  File "/home/osboxes/miniconda2/lib/python2.7/unittest/runner.py", line 7, in <module>
    from .signals import registerResult
  File "/home/osboxes/miniconda2/lib/python2.7/unittest/signals.py", line 2, in <module>
    import weakref
  File "/home/osboxes/miniconda2/lib/python2.7/weakref.py", line 14, in <module>
    from _weakref import (
ImportError: cannot import name _remove_dead_weakref

Some information: Python version is Python 2.7.14 :: Anaconda, Inc. (Is there a difference between python 2.7.14 and my version which has anaconda, inc. at the end?) The python program also runs just fine by itself. 一些信息:Python版本是Python 2.7.14 :: Anaconda,Inc.(python 2.7.14和我的版本之间有anaconda,inc。的版本之间有区别吗?)python程序本身也运行良好。 Any help would be appreciated. 任何帮助,将不胜感激。 Thanks! 谢谢!

Edit: The path was being all weird with some parts going to my local python and numpy going to miniconda's python. 编辑:路径变得很奇怪,有些部分转到了我的本地python,而numpy转到了miniconda的python。 Uninstalling miniconda as it wasn't needed for me fixed it. 卸载miniconda,因为我不需要修复它。

This is happening because your environment is mixing two different Python installations. 发生这种情况是因为您的环境正在混合两个不同的Python安装。 You can see it jump between them here: 您可以在这里看到它们之间的跳跃:

File "/home/osboxes/.local/lib/python2.7/site-packages/numpy/testing/__init__.py"
File "/home/osboxes/miniconda2/lib/python2.7/unittest/__init__.py"

So you start out in /home/osboxes/.local/lib/python2.7/site-packages which is the Python installed by some system package manager (or perhaps even explicitly installed from source). 因此,您从/home/osboxes/.local/lib/python2.7/site-packages开始,这是某个系统软件包管理器(甚至可能是从源代码显式安装)安装的Python。 But then it jumps to /home/osboxes/miniconda2/lib/python2.7 which is from Conda. 但是随后它跳转到了来自Conda的/home/osboxes/miniconda2/lib/python2.7

Since it appears you are intending to use Python from Conda, you need to install NumPy using Conda (so it is loaded from miniconda2 and not .local , and build your code using something like -I/home/osboxes/miniconda2/include/python2.7 instead of -I/usr/include/python2.7 . 既然您似乎打算从Conda使用Python,则需要使用Conda安装NumPy(因此它是从miniconda2而不是.local加载的,并使用-I/home/osboxes/miniconda2/include/python2.7类的代码来构建代码-I/home/osboxes/miniconda2/include/python2.7而不是-I/usr/include/python2.7

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM