Вызов кода Python из общей библиотеки C++Python

Программы на Python
Ответить
Anonymous
 Вызов кода Python из общей библиотеки C++

Сообщение Anonymous »

Я использую boost::python в плагине общей библиотеки для запуска некоторого кода Python.
Общая библиотека загружается как плагин во время выполнения моей основной программы с помощью API boost::dll::shared_library. т. е. моя основная программа не связана с плагином общей библиотеки.
Мой код работает на Ubuntu 20.04.
Я связываю свою общую библиотеку с Питон:

Код: Выделить всё

my_shared_lib/CMakeLists.txt:
find_package(Python3 COMPONENTS Development NumPy REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE ${Python3_LIBRARIES} Python3::NumPy)
При запуске следующего кода из моей общей библиотеки я получаю ошибку ImportError:

Код: Выделить всё

#include 
Py_Initialize();
namespace np = boost::python::numpy;
np::initialize(); //ImportError here
Я получаю следующую ошибку:

Ошибка импорта: /home/myuser/.local/lib/python3.8 /site-packages/numpy/core/_multiarray_umath.cpython-38-x86_64-linux-gnu.so: неопределенный символ: PyObject_SelfIter

Я проверил, что у меня есть /usr/lib/x86_64-linux-gnu/libpython3.8.so в моем LD_LIBRARY_PATH.При связывании моей основной программы с Python программа OK запускается без ошибки ImportError

Код: Выделить всё

main_program/CMakeLists.txt:
find_package(Python3 COMPONENTS Development NumPy REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE ${Python3_LIBRARIES} Python3::NumPy)
Мой вывод заключается в том, что загрузка плагина общей библиотеки во время выполнения, похоже, не загружает libpython3.8.so, при загрузке libpython3.8.so в основной программа делает его доступным для плагина общей библиотеки.
Если я вручную загружу libpython3.8.so в свою общую библиотеку следующим образом:

Код: Выделить всё

#include 
#include 
dlopen("/usr/lib/x86_64-linux-gnu/libpython3.8.so", RTLD_LAZY | RTLD_GLOBAL);
Py_Initialize();
namespace np = boost::python::numpy;
np::initialize();
В дальнейшем я получаю другую ошибку:

Traceback (последний последний вызов):

Файл «/home/myuser/.local/lib/python3.8/site-packages/numpy/core/init.py», строка 23, в
из . импортировать несколько массивов

Файл "/home/myuser/.local/lib/python3.8/site-packages/numpy/core/multiarray.py", строка 10, в

из . переопределения импорта

Файл "/home/myuser/.local/lib/python3.8/site-packages/numpy/core/overrides.py", строка 6, в

из импорта numpy.core._multiarray_umath (
ImportError: PyCapsule_Import не удалось импортировать модуль «datetime»

Как сделать так, чтобы мой плагин общей библиотеки автоматически загружал libpython3.8.so при его загрузке?
ИЗМЕНИТЬ >
Используя gdb, я вижу, что мое первоначальное предположение было неверным. Когда основное приложение загружает мой плагин общей библиотеки, оно также загружает libpython3.8.so.1.0.
Загружено Загружено. '/home/myuser/.vs/mainapp/build/plugins/libap_python_detector.so'. Символы загружены.
Загружено '/usr/local/3rdparty/hpc/5.13.0-39_AMD_EPYC/boost176/build/lib/. libboost_numpy38.so.1.76.0' Символы загружены.
Загружено. '/lib/x86_64-linux-gnu/libpython3.8.so.1.0'. Символы загружены.
Загружено '/usr/local/3rdparty/hpc/5.13.0-39_AMD_EPYC/boost176/build/lib/libboost_python38. .so.1.76.0' Символы загружены.
Итак. что не так с загрузкой numpy?

Подробнее здесь: https://stackoverflow.com/questions/732 ... ed-library
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»