C++ - встраивание Python с помощью numpy

Я хотел бы вызвать функцию python из C++ и получить возвращаемое значение. Я смог сделать это с помощью простой функции умножения на Python, используя пример кода веб-сайта это в разделе 5.3. Чтобы скомпилировать свою программу, я бы запустил 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 также отлично работает сама по себе. Любая помощь будет оценена по достоинству. Спасибо!

Обновлено: путь был странным, некоторые части уходили на мой локальный питон, а numpy - на питон miniconda. Удаление miniconda, поскольку оно мне не нужно, исправило это.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 006
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, установленный каким-то системным менеджером пакетов (или, возможно, даже явно установленный из исходников). Но затем он переходит на /home/osboxes/miniconda2/lib/python2.7 от Conda.

Поскольку похоже, что вы собираетесь использовать Python из Conda, вам необходимо установить NumPy с помощью Conda (чтобы он загружался с miniconda2, а не с .local, и построить свой код, используя что-то вроде -I/home/osboxes/miniconda2/include/python2.7 вместо -I/usr/include/python2.7.

Имеет смысл. Я попытался построить свой код вокруг него, используя предложенный -I/home/osboxes/miniconda2/include/python2.7 после установки NumPy в Conda, и, похоже, сначала он все равно переходит на /home/osboxes/.local/lib/python2.7/site-packages и получает ту же ошибку ImportError, о которой я упоминал выше. Я считаю, что код, который я собираюсь использовать, на самом деле не требует Python от Conda. Можно ли просто использовать мой локальный питон вместо Conda?

Steven T 01.04.2018 06:06

Какая у вас переменная окружения PYTHONPATH? Какая библиотека Python отображается при запуске ldd в исполняемом файле? Вы, безусловно, можете избежать использования Python из Conda - это, вероятно, произойдет по умолчанию, если вы убедитесь, что его нет в вашем PYTHONPATH.

John Zwinck 01.04.2018 06:30

Я помню, как смотрел на здесь, и поэтому я установил свой PYTHONPATH на .. По умолчанию мой PYTHONPATH ни на что не настроен. Когда я запускаю ldd в исполняемом файле, созданном из g++ test.cpp -I/home/osboxes/miniconda2/include/python2.7 -lpython2.7, он связан с libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0.

Steven T 01.04.2018 07:17

Хорошо, поэтому вам нужно решить, хотите ли вы использовать miniconda (для всего!) Или нет (для чего-либо!). Вероятно, вам не следует устанавливать PYTHONPATH ни на что, если только вам не нужно настраивать его так, чтобы он мог import использовать ваши собственные файлы .py.

John Zwinck 01.04.2018 07:19

Когда я не устанавливаю PYTHONPATH ни на что, у меня возникает ошибка, которая была в ранее связанном сообщении ссылка здесь снова. Я бы не хотел ни для чего использовать miniconda (будет ли удаление conda хакерским обходным путем?)

Steven T 01.04.2018 07:22

Хорошо, хорошо, значит, вам понадобится PYTHONPATH=. или аналогичный, чтобы найти ваш .py-файл. Как вы установили NumPy? Вы его собрали из исходников, или apt-get install numpy, что ли?

John Zwinck 01.04.2018 07:30

Я использовал pip install numpy для установки NumPy.

Steven T 01.04.2018 07:33

ОК. Я предлагаю пока удалить Conda. Это может либо заставить его работать, либо сделать путь к работе более ясным.

John Zwinck 01.04.2018 07:36

Это устранило все мои проблемы. Большое вам спасибо за помощь!

Steven T 01.04.2018 07:40

Другие вопросы по теме