У меня есть некоторый код, написанный на C ++, который я пытаюсь использовать в Python, не переписывая полный код Python снова, и я использую Pybind11 для создания модуля Python для этого.
Я пытаюсь достичь этой цели в Microsoft Visual Studio 2015, следуя этой инструкции здесь https://pybind11.readthedocs.io/en/stable/basics.html
Я делал следующие вещи в визуальной студии.
1) Скачал Pybind11 с https://codeload.github.com/pybind/pybind11/zip/master
2) Разархивировал файл
3) В визуальной студии появился новый пустой C ++ проект.
4) Добавлены мой интерпретатор Python, включающий папку (C: / python27 / include) и Pybind11 (C: / Pybind11 / include) в каталогах VC ++> каталоги include
5) Добавлены дополнительные зависимости (C: \ Python27 \ libs \ python27.lib) в Linker> input> Дополнительные зависимости
6) Для использования выходного файла в Python мне нужен файл .pyd, поэтому я изменил здесь Свойства конфигурации> Общие> Целевое расширение: .pyd
7) Измените настройки проекта по умолчанию> тип конфигурации на Динамическая библиотека (.dll)
Так что я могу построить свой проект и сгенерировать файл .pyd, но при импорте этого модуля я получаю следующую ошибку:
ImportError: динамический модуль не определяет функцию инициализации (initProject11)
Я искал эту ошибку и получил эту ссылку http://pybind11.readthedocs.io/en/stable/faq.html
но я не мог найти свое решение.
Поэтому я ищу решение для вышеуказанной проблемы. Заранее большое спасибо.
вот мой код файла CPP
#include <pybind11/pybind11.h>
int add(int i, int j) {
return i + j;
}
namespace py = pybind11;
PYBIND11_PLUGIN(example) {
py::module m("example", "pybind11 example plugin");
m.def("add", &add, "A function which adds two numbers");
return m.ptr();
}
В питоне имя .pyd
Файл должен совпадать с модулем, который находится внутри. Из документации (https://docs.python.org/2/faq/windows.html):
Если у вас есть DLL с именем
foo.pyd
тогда у него должна быть функцияinitfoo()
, Затем вы можете написать Python «import foo», и Python будет искать foo.pyd (а также foo.py, foo.pyc) и, если найдет его, попытается вызватьinitfoo()
инициализировать это.
В своем коде вы создаете модуль Python с именем example
поэтому выходной файл должен быть example.pyd
,
Редактировать:
Часто задаваемые вопросы по pybind11 упоминают несовместимую версию Python как еще один возможный источник ошибок (https://pybind11.readthedocs.io/en/stable/faq.html):
ImportError: динамический модуль не определяет функцию инициализации
Убедитесь, что имя указано в
pybind::module
а такжеPYBIND11_PLUGIN
соответствует и совпадает с именем файла библиотеки расширений. Последний не должен содержать никаких дополнительных префиксов (например, test.so вместо libtest.so).Если вышеизложенное не решило вашу проблему, то вы, вероятно, используете несовместимую версию Python (например, библиотека расширений была скомпилирована для Python 2, в то время как интерпретатор работает поверх какой-либо версии Python 3 или наоборот)
Других решений пока нет …