Создание примеров python с использованием Visual Studio 2008

Я использую библиотеку Boost Python для создания расширений python для моего кода на С++. Я хотел бы иметь возможность вызывать из python функцию "greet" из кода С++, показанного ниже:

#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?

Ответ 1

Во-первых, убедитесь, что вы пытаетесь импортировать версию выпуска из Python; импорт версии отладки завершится неудачно, потому что версии библиотеки исполнения не совпадают. Я также изменяю свои свойства проекта, чтобы версия выпуска выводила файл .pyd:

Свойства → Коннектор → Выход:

$(OutDir)\$(ProjectName).pyd

(Я также создаю post-build action для запуска модульных тестов с python)

Затем убедитесь, что вы определили следующее в файле stdafx.h:

#define BOOST_PYTHON_STATIC_LIB

Наконец, если у вас установлено более одной версии python, убедитесь, что вы импортируете правильную версию python.h(в Инструменты → Параметры → Проекты и решения → Каталоги VС++ → Включите файлы).

Ответ 2

Ошибка ImportError: Ошибка загрузки Dll обычно означает, что ваш .pyd-модуль зависит от других DLL, которые не могут быть найдены - часто msvc *.dll. Возможно, вам захочется открыть файл .pyd в "Блокноте" и найти ".dll". Затем проверьте, существуют ли все DLL-зависимости в вашем каталоге или PATH.

Или используйте Dependency Walker, который найдет для вас недостающие зависимости

Ответ 3

Несмотря на то, что это вопрос, выпущенный несколько лет назад (все еще нелегко найти решение), но сегодня я сталкиваюсь с той же проблемой, и после нескольких часов поиска, наконец, я нашел приемлемое решение.

  • Причина столь же проста, как это заметил @AndiDog, файл .pyd, который вы создаете, зависит от другого .dll;
  • В моем случае It boost_python-vc120-mt-1_58.dll в папке [С++ boost folder]/stage/lib/
  • Итак, что я делаю, это скопировать этот файл и вставить его в папку .pyd, а затем мой python может правильно импортировать проект, который я создаю.

  • Возможно, есть и другие решения, которые строят ваш проект, не зависящий от динамической библиотеки, вместо этого используйте статическую библиотеку. некоторые из источников сказали определить BOOST_PYTHON_STATIC_LIB в VS Preprocessor, тогда ваш проект не будет зависеть от динамической библиотеки (я новый С++ er), но убедитесь, что вы создали libboost_python-vcXXX-mt-1_58.dll в boost.

  • для определения препроцессора, маршрут: C/С++ → Препроцессор- > Определения препроцессора- > изменить BOOST_PYTHON_STATIC_LIB

Ответ 4

Пожалуйста, убедитесь, что у вас есть флаг -lpython26 (если вы используете python2.6), а имя файла должно быть hello_ext.pyd в вашем случае.