создание улучшенных примеров Python с использованием Visual Studio 2008 - PullRequest
11 голосов
/ 07 января 2010

Я использую библиотеку Boost Python для создания расширений Python для моего кода C ++. Я хотел бы иметь возможность вызывать из python функцию 'greet' из кода 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);
}

И код питона:

import hello_ext
print hello_ext.greet() 

Мне удалось сделать это с помощью bjam (hello_ext.pyd сгенерирован, и он хорошо работает), но теперь я хотел бы построить его с помощью Visual Studio 2008. Hello.dll создается (но не hello_ext. длл ни какой .пид). После вызова моего кода Python я получаю сообщение об ошибке:

ImportError: нет модуля с именем hello_ext.

После переименования hello.dll в hello.pyd или hello_ext.pyd я получаю еще одну ошибку ImportError: Ошибка загрузки DLL

Как создать правильный файл .pyd с использованием VS 2008?

Ответы [ 4 ]

10 голосов
/ 07 января 2010

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

Свойства >> Линкер >> Вывод:

$(OutDir)\$(ProjectName).pyd

(я также создаю действие после сборки для запуска модульных тестов из python)

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

#define BOOST_PYTHON_STATIC_LIB

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

5 голосов
/ 09 января 2010

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

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

1 голос
/ 02 июля 2016

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

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

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

  • для определения препроцессора, маршрут: C / C ++ -> Препроцессор-> Определения препроцессора-> edit BOOST_PYTHON_STATIC_LIB
0 голосов
/ 07 января 2010

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

...