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 =&gt; /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 好的,所以你需要决定是否要使用 miniconda (用于一切!)或不(用于任何东西!)。可能您不应该将PYTHONPATH 设置为任何内容,除非您需要将其设置为能够import 您自己的.py 文件。 好的。我建议现在卸载 Conda。这可能会使它发挥作用,或者使工作路径更加清晰。

以上是关于C++ - 使用 numpy 嵌入 Python的主要内容,如果未能解决你的问题,请参考以下文章

在嵌入式 Python C++ 应用程序中导入 Numpy

在 C++ Qt 应用程序中嵌入 Python/Numpy/Matplotlib?

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

C++ 中的嵌入式 python:importerror importing numpy.core.multiarray

使用 Numpy 将 Python 库静态链接到 C (C++)

c++ 中的嵌入式 python 代码 - 导入 python 库时出错