Я хотел бы вызвать функцию 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. Вы можете увидеть, как он прыгает между ними здесь:
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.
Какая у вас переменная окружения PYTHONPATH? Какая библиотека Python отображается при запуске ldd в исполняемом файле? Вы, безусловно, можете избежать использования Python из Conda - это, вероятно, произойдет по умолчанию, если вы убедитесь, что его нет в вашем PYTHONPATH.
Я помню, как смотрел на здесь, и поэтому я установил свой 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.
Хорошо, поэтому вам нужно решить, хотите ли вы использовать miniconda (для всего!) Или нет (для чего-либо!). Вероятно, вам не следует устанавливать PYTHONPATH ни на что, если только вам не нужно настраивать его так, чтобы он мог import использовать ваши собственные файлы .py.
Когда я не устанавливаю PYTHONPATH ни на что, у меня возникает ошибка, которая была в ранее связанном сообщении ссылка здесь снова. Я бы не хотел ни для чего использовать miniconda (будет ли удаление conda хакерским обходным путем?)
Хорошо, хорошо, значит, вам понадобится PYTHONPATH=. или аналогичный, чтобы найти ваш .py-файл. Как вы установили NumPy? Вы его собрали из исходников, или apt-get install numpy, что ли?
Я использовал pip install numpy для установки NumPy.
ОК. Я предлагаю пока удалить Conda. Это может либо заставить его работать, либо сделать путь к работе более ясным.
Это устранило все мои проблемы. Большое вам спасибо за помощь!
Имеет смысл. Я попытался построить свой код вокруг него, используя предложенный
-I/home/osboxes/miniconda2/include/python2.7после установки NumPy в Conda, и, похоже, сначала он все равно переходит на/home/osboxes/.local/lib/python2.7/site-packagesи получает ту же ошибку ImportError, о которой я упоминал выше. Я считаю, что код, который я собираюсь использовать, на самом деле не требует Python от Conda. Можно ли просто использовать мой локальный питон вместо Conda?