C++ - 使用 numpy 嵌入 Python
Posted
技术标签:
【中文标题】C++ - 使用 numpy 嵌入 Python【英文标题】:C++ - Python Embedding with numpy 【发布时间】:2018-04-01 01:43:42 【问题描述】:我想从 C++ 调用一个 python 函数并获取返回值。我已经能够通过使用this 网站第 5.3 节中的示例代码的简单乘法 python 函数来做到这一点。要编译我的程序,我会运行g++ test.cpp -I/usr/include/python2.7 -lpython2.7
。但是,我要运行的 python 函数导入 numpy.当我尝试运行类似于上述代码示例的程序时,我收到“ImportError:无法导入名称_remove_dead_weakref”。完整的错误在这里:
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
一些信息:Python 版本是 Python 2.7.14 :: Anaconda, Inc. (python 2.7.14 和我的最后有 anaconda, inc. 的版本有区别吗?)python 程序也运行得很好通过它自己。任何帮助,将不胜感激。谢谢!
编辑:路径很奇怪,有些部分会转到我的本地 python,而 numpy 会转到 miniconda 的 python。卸载 miniconda,因为我不需要它。
【问题讨论】:
【参考方案1】:发生这种情况是因为您的环境混合了两种不同的 Python 安装。你可以在这里看到它在它们之间跳转:
File "/home/osboxes/.local/lib/python2.7/site-packages/numpy/testing/__init__.py"
File "/home/osboxes/miniconda2/lib/python2.7/unittest/__init__.py"
所以你从/home/osboxes/.local/lib/python2.7/site-packages
开始,这是一些系统包管理器安装的 Python(或者甚至可能从源代码显式安装)。但随后它跳转到来自 Conda 的/home/osboxes/miniconda2/lib/python2.7
。
由于您似乎打算使用来自 Conda 的 Python,因此您需要使用 Conda 安装 NumPy(因此它是从 miniconda2
而不是 .local
加载的,并使用类似 -I/home/osboxes/miniconda2/include/python2.7
而不是 @ 来构建您的代码987654328@.
【讨论】:
有道理。在将 NumPy 安装到 Conda 之后,我尝试使用建议的-I/home/osboxes/miniconda2/include/python2.7
围绕它构建我的代码,它似乎仍然首先转到 /home/osboxes/.local/lib/python2.7/site-packages
并得到与我上面提到的相同的 ImportError。我相信我打算使用的代码实际上并不需要来自 Conda 的 Python。是否可以只使用我本地的 python 而不是 Conda 的?
您的PYTHONPATH
环境变量设置为什么?在可执行文件上运行 ldd
时会列出哪个 Python 库?您当然可以避免使用来自 Conda 的 Python——如果您确保它不在您的 PYTHONPATH
中,默认情况下可能会发生这种情况。
我记得看过here,所以我将PYTHONPATH
设置为.
。默认情况下,我的 PYTHONPATH
未设置任何内容。当我在从 g++ test.cpp -I/home/osboxes/miniconda2/include/python2.7 -lpython2.7
生成的可执行文件上运行 ldd
时,它链接到 libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
。
好的,所以你需要决定是否要使用 miniconda (用于一切!)或不(用于任何东西!)。可能您不应该将PYTHONPATH
设置为任何内容,除非您需要将其设置为能够import
您自己的.py 文件。
好的。我建议现在卸载 Conda。这可能会使它发挥作用,或者使工作路径更加清晰。以上是关于C++ - 使用 numpy 嵌入 Python的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ Qt 应用程序中嵌入 Python/Numpy/Matplotlib?
从 C++ 应用程序中的嵌入式 Python 调用时,多数组扩展库上的 Numpy 导入失败
C++ 中的嵌入式 python:importerror importing numpy.core.multiarray