Я пользуюсь библиотекой Boost Python для создания расширений Python моего кода C++. Я хотел бы иметь возможность вызвать из Python 'приветствовать' функцию от кода C++, показанного ниже:
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
И код Python:
import hello_ext
print hello_ext.greet()
Мне удалось сделать это использование bjam (hello_ext.pyd, сгенерирован, и это работает хорошее), но теперь я хотел бы создать его с помощью Visual Studio 2008. hello.dll создается (но ни hello_ext.dll, ни любой .pyd). После вызова моего Python кодируют, я получаю ошибку:
ImportError: Никакой модуль, названный hello_ext.
После переименования hello.dll к hello.pyd или hello_ext.pyd, я получаю другой ImportError: загрузка Dll перестала работать
Как я могу создать корректный .pyd файл с помощью VS 2008?
Во-первых, убедитесь, что вы только пытаетесь импортировать отладочную версию с Python; импорт отладочной версии будет неудачным, так как версии библиотек исполнения не совпадают. Я также изменил свойства своего проекта так, что релиз-версия выводит .pyd файл:
Properties >> Linker >> Output:
$(OutDir)\$(ProjectName).pyd
(Я также создаю постбилдинговое действие для запуска юнит-тестов с python)
Next, убедитесь, что вы определили следующее в вашем stdafx. h файл:
#define BOOST_PYTHON_STATIC_LIB
Наконец, если у Вас установлено более одной версии питона, убедитесь, что Вы импортируете правильную версию python.h (в меню Инструменты >> Параметры >> Проекты и решения >> VC++ Директории >> Включить файлы).
(Я также создаю постбилдинговую акцию для запуска юнит-тестов с питона)Далее, убедитесь, что Вы определили в своем stdafx следующее.
Убедитесь, что у вас установлен флаг -lpython26
(если вы используете python2.6), а имя файла должно быть hello_ext.pyd
в вашем случае.
Ошибка ИмпортОшибка: Не удалось загрузить Dll обычно означает, что ваш модуль .pyd зависит от других DLL, которые не удалось найти - часто msvc*.dll. Вы можете попробовать открыть файл .pyd в Блокноте и поискать ".dll". Затем проверьте, существуют ли все DLL-зависимости в Вашем каталоге или PATH.
Или используйте Dependency Walker, который найдет недостающие зависимости для вас
.