Используйте библиотеку Pybind11, созданную с помощью MSYS2, CMake и Make в Python

Я только что создал библиотеку с Pybind11 со стороны C++: Я сделал это с помощью MSYS2, CMake и Make. (У меня установлены GCC, Make, CMake и Pybind11 с помощью команд)

pacman -S mingw-w64-x86_64-gcc
pacman -S mingw-w64-x86_64-cmake
pacman -S mingw-w64-x86_64-make
pacman -S mingw-w64-x86_64-pybind11

Вот пример.cpp

#include <pybind11/pybind11.h>

int add(int i, int j) {
    return i + j;
}

PYBIND11_MODULE(example, m) {
    m.doc() = "pybind11 example plugin"; // optional module docstring

    m.def("add", &add, "A function that adds two numbers");
}

Здесь CMakeLists.txt (в том же каталоге, что и example.cpp)

cmake_minimum_required(VERSION 3.3)

# Notre projet est étiqueté hello
project(example)

find_package(Python COMPONENTS Interpreter Development)
find_package(pybind11 CONFIG)

# pybind11 method:
pybind11_add_module(example example.cpp)

Затем я выполнил команды

mkdir buildmingw
cd buildmingw
cmake .. -G "MinGW Makefiles"
mingw32-make 

и создается файл example.cp311-win_amd64.pyd.

Как я могу использовать этот файл сейчас в Python?

Я уже пытался поместить test.py в тот же каталог, что и example.cp311-win_amd64.pyd, а затем запустил:

python test.py

где test.py выглядит так:

import example

print( example.add(7,13 ) )

Я получаю сообщение об ошибке:

D:\Informatik\NachhilfeInfoUni\KadalaSchmittC++\PythonBindC++\buildmingw4>python tes
t.py
Traceback (most recent call last):
  File "D:\Informatik\NachhilfeInfoUni\KadalaSchmittC++\PythonBindC++\buildmingw4\test.py", line 1, in <module>
    import example
ImportError: DLL load failed while importing example: Das angegebene Modul wurde nicht gefunden.

Что я делаю не так? Как мне правильно импортировать мою библиотеку?

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Судя по названию, ваш модуль расширения pybind11 скомпилирован с использованием Python 3.11. Вероятно, вы захотите проверить, использует ли последний вызов python test.py согласованную версию интерпретатора Python 3.11.

Альтернативно, вы можете создать venv и вызывать все команды (включая pip install, cmake, make и python test.py) с активированным venv.

Как узнать, действительно ли он скомпилирован под Python 3.11?? Или, если нет, то против какой другой версии? Если я наберу python --version в свой терминал, моя версия будет 3.11.1, которая тогда должна быть правильной. Мне также удалось запустить все из виртуальной среды, но там тоже версия Python 3.11.1 и я получаю такое же сообщение об ошибке.

user172501 30.05.2024 14:42

Как я могу проверить, использует ли мой последний вызов python test.py согласованную версию интерпретатора Python. Если я скажу python --version, это даст мне 3.11.1

user172501 30.05.2024 19:32

@ user172501 Рад слышать, что вы решили эту проблему. Как правило, это обратная сторона использования модулей расширения — вам нужно строить на основе любой целевой арки/версии/диалекта, который вы планируете поддерживать. Моя лучшая практика — использовать пакет-оболочку, чтобы скрыть импорт/загрузку нескольких модулей расширения, ориентированных на разные платформы.

liuyu 31.05.2024 04:41

Версия Python действительно была проблемой. У меня был установлен один Python из Python для Windows

Другая версия Python была установлена ​​MSYS2 без моего ведома. Первая упомянутая версия Python находилась в каталоге C:\Python, и путь был настроен правильно. Я переименовал этот каталог в C:\PythonHidden.

Затем я снова запустил CMake и Make, как в вопросе. Теперь был создан файл example.cp311-mingw_x86_64.pyd.

И этот я мог бы импортировать.

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