Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: libboost python  (Прочитано 8167 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 18-06-2009 14:27 » 

libboost python

нашел судя по документации очень удобный врапер, для expose с++ функций

поставил libboost через инсталятор: http://www.boostpro.com/download/boost_1_38_setup.exe
с выбором всех коневых пунктов и питона под msvc 9.0

проверил через
Код:
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator<int> in;

    std::for_each(
        in(std::cin), in(), std::cout << (_1 * 3) << " " );
}
вроде с первого взгляда все работает

но при проверке использования питоновских библиотек:
Код:
#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

компилятор выдает ошибку:
Код:
------ Построение начато: проект: pyton_embed, Конфигурация: Debug Win32 ------
Компиляция...
pyton_embed.cpp
l:\program files\boost\boost_1_38\boost\python\converter\builtin_converters.hpp(110) : error C2039: PyInt_FromLong: не является членом "`global namespace'"
l:\program files\boost\boost_1_38\boost\python\converter\builtin_converters.hpp(110) : error C3861: PyInt_FromLong: идентификатор не найден
l:\program files\boost\boost_1_38\boost\python\converter\builtin_converters.hpp(110) : error C2065: PyInt_Type: необъявленный идентификатор
l:\program files\boost\boost_1_38\boost\python\converter\builtin_converters.hpp(110) : error C2039: PyInt_FromLong: не является членом "`global namespace'"
l:\program files\boost\boost_1_38\boost\python\converter\builtin_converters.hpp(110) : error C3861: PyInt_FromLong: идентификатор не найден
l:\program files\boost\boost_1_38\boost\python\converter\builtin_converters.hpp(110) : error C2065: PyInt_Type: необъявленный идентификатор
l:\program files\boost\boost_1_38\boost\python\converter\builtin_converters.hpp(110) : error C2039: PyInt_FromLong: не является членом "`global namespace'"
l:\program files\boost\boost_1_38\boost\python\converter\builtin_converters.hpp(110) : error C3861: PyInt_FromLong: идентификатор не найден
l:\program files\boost\boost_1_38\boost\python\converter\builtin_converters.hpp(110) : error C2039: PyInt_FromLong: не является членом "`global namespace'"
....

c чем могут быть связаны данные ошибки?
Записан

1n c0de we trust
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 19-06-2009 03:20 » 

примеры, поставляемые с бустом работают?
Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #2 : 19-06-2009 04:53 » 

примеры, поставляемые с бустом работают?

которые не требуют питона работают, походу boost/python.hpp я ваще подключит не могу
Записан

1n c0de we trust
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 19-06-2009 05:56 » 

полный текст примера(с заголовками) покажи пожалуйста
Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #4 : 19-06-2009 06:31 » 

полный текст примера(с заголовками) покажи пожалуйста

Код:
#include <boost/python.hpp>

int main() {}
Записан

1n c0de we trust
Mayor
Специалист

ru
Offline Offline

« Ответ #5 : 19-06-2009 06:32 » 

так я в этой msvc 9 походу не в зуб ногой, попробую перебраться под debian g++ 4.1, может там попроще причину ошибки отловить


перебрался под линукс там проблемма с boost/python.hpp решилась добавлением  -I /usr/lib/python2.4

но после того как добавил библиотеку libboost_python-gcc41-mt.a, линкер по прежнему не может найти _Py_NoneStruct

под линуксом начало решено, почему то как обычно получается найти ошибки на порядок быстрее чем под виндой:

Код:
#include <boost/python.hpp>
#include <iostream>

int main() {
std::cout<<"hello there"<<std::endl;
}

ptn_boost : pt_test.cpp
g++ -I /workspace/nw1/b1/include/boost-1_39/ -I /usr/include/python2.4/ -o ptn_boost pt_test.cpp /workspace/nw1/boost/boost_1_39_0/stage/lib/libboost_python-gcc41-mt.a  -lpython2.4
# /usr/lib/python2.4/config/libpython2.4.a
reg_boost : reg_test.cpp
g++ -I /workspace/nw1/b1/include/boost-1_39/ -o reg_boost reg_test.cpp  /workspace/nw1/boost/boost_1_39_0/stage/lib/libboost_regex-gcc41-mt.a

как я понимаю, почему не работает под виндой - телепаты пока в отпуске, надо будет подумать как конкретнее задать вопрос про msvc ...
« Последнее редактирование: 19-06-2009 07:09 от Mayor » Записан

1n c0de we trust
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 19-06-2009 09:27 » 

Под виндой видимо также решается Улыбаюсь добавлением инклюда в настройки проекта
Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #7 : 19-06-2009 15:00 » 

Под виндой видимо также решается Улыбаюсь добавлением инклюда в настройки проекта

под виндой я сразу же заметил, что он требуется когда посмотрел в лог и подключил, что естественно просто изменило характер ошибок, под линухом такая заморочка возникла из-за того что я забыл про 2>&1 и начал изучать лог примерно с середины
Записан

1n c0de we trust
Mayor
Специалист

ru
Offline Offline

« Ответ #8 : 19-06-2009 15:37 » 

хрен знает как нада было формулировать вопрос ...

в общем оказалось, что libboost-python не поддерживает python 3.0.1, подсунул хидеры от 2.6.2 и все заработало

странная тенденция вырисовывается, под лином с библиотеками удается разбираться раз в 10 быстрее ... поначалу думал, что это связано с тем, что их недопортировали с лина под винду Улыбаюсь
Записан

1n c0de we trust
Mayor
Специалист

ru
Offline Offline

« Ответ #9 : 19-06-2009 16:56 » 

мда, удалось разобраться как дергать объекты из питона в сишный код:
Код:
#include <boost/python.hpp>
char const* greet()
{
   return "hello, world";
}
#include <string>
#include <iostream>


int main( int argc, char ** argv ) {
using namespace boost::python;
using std::string;
using std::cout;
using std::endl;
Py_Initialize();
object main_module = import("__main__");
PyRun_SimpleString("a=\"marimero\"");
string l = extract<string>(main_module.attr("a"));
cout<<l<<endl;
PyRun_SimpleString("print \"hello there\" ");
//Py_Finalize();
return 0;
}

а вот пока копался с вызовом сишных функций из питона, натолкнулся на:
Currently, Boost.Python does not directly support everything you'll need when embedding. Therefore you'll need to use the Python/C API to fill in the gaps.

типа вернемся обратно к нашим баранам
Записан

1n c0de we trust
Mayor
Специалист

ru
Offline Offline

« Ответ #10 : 20-06-2009 17:05 » 

оказалось действительно не все поддерживает, проблемма решилась через python c\ api:
PyImport_AppendInittab - не знаю уж для чего они эту функцию выдумали, но через нее получилось подгрузить внутренний модуль приложения, которое запускает внутри себя интерпретатор питона

приложение тоже какое-то странное получилось, помимо таблицы импорта, почему-то возникла таблица экспорта - теоретически его может подгрузить питон как длл, только я никакой длл ентри или майн или как там она называется не создавал
Записан

1n c0de we trust
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines