Thread View: pl.comp.lang.python
3 messages
3 total messages
Started by Marek
Fri, 06 Aug 2010 09:31
[boost.Python] Wołanie metod obiektów Pythona w c++
Author: Marek
Date: Fri, 06 Aug 2010 09:31
Date: Fri, 06 Aug 2010 09:31
60 lines
2006 bytes
2006 bytes
Witam,
Pyytanie kierowane jest do osób, które integrowały Pythona i C++ przy
pomocy np boost.Python.
Otóż mam klasę w C++, którą chcę wykorzystać jako moduł Pythona, ale w
taki sposób, aby odwoływała się ona do uprzednio stworzonych i
"zarejestrowanych" obiektów klasy zdefiniowanej w pure-Python.
Coś na zasadzie:
#v+
m=cppmodule.cppclass()()
t=pythonmodule.pythonclass()
m.register_callback(t)
m.start()
#v-
To co zrobiłem to testowa metodę w kodzie C++, która wywoła prostą metodę
obiektu w Pythonie wypisującego string:
#v+
void cppmodule::register_callback(boost::python::object& obj)
{
this->callback = obj;
callback.attr("p")(); //tutaj wszystko działa
return;
}
#v-
Następnie w kodzie wywołuję metodę
#v+
void cppmodule::test()
{
callback.attr("p")();
return;
}
#v-
i wtedy dostaję "Segmentation fault".
Dodam, że podczas działania aplikacji nic nie jest usuwane z pamięci (ani
del w Pythonie, ani w delete w C++) a zmienna callback jest w globalnym
ukrytym obiekcie. w cppmodule::test() nawet sama instrukcja
#v+
if (callback==NULL) return;
#v-
już powoduje segmentation fault, więc nie wiem o co chodzi.
Czy ktoś ma jakiś pomysł?
pozdrawiam
Marek
Re: [boost.Python] Wołanie metod obiektów Pythona w c++
Author: bbb
Date: Fri, 06 Aug 2010 10:02
Date: Fri, 06 Aug 2010 10:02
72 lines
2480 bytes
2480 bytes
Marek pisze:
> Witam,
>
> Pyytanie kierowane jest do osób, które integrowały Pythona i C++ przy
> pomocy np boost.Python.
>
> Otóż mam klasę w C++, którą chcę wykorzystać jako moduł Pythona, ale w
> taki sposób, aby odwoływała się ona do uprzednio stworzonych i
> "zarejestrowanych" obiektów klasy zdefiniowanej w pure-Python.
>
> Coś na zasadzie:
>
> #v+
> m=cppmodule.cppclass()()
> t=pythonmodule.pythonclass()
>
> m.register_callback(t)
> m.start()
> #v-
>
>
> To co zrobiłem to testowa metodę w kodzie C++, która wywoła prostą metodę
> obiektu w Pythonie wypisującego string:
>
> #v+
> void cppmodule::register_callback(boost::python::object& obj)
> {
>
> this->callback = obj;
> callback.attr("p")(); //tutaj wszystko działa
> return;
>
> }
> #v-
>
> Następnie w kodzie wywołuję metodę
>
> #v+
> void cppmodule::test()
> {
>
> callback.attr("p")();
>
> return;
> }
> #v-
>
> i wtedy dostaję "Segmentation fault".
>
> Dodam, że podczas działania aplikacji nic nie jest usuwane z pamięci (ani
> del w Pythonie, ani w delete w C++) a zmienna callback jest w globalnym
> ukrytym obiekcie. w cppmodule::test() nawet sama instrukcja
> #v+
> if (callback==NULL) return;
> #v-
> już powoduje segmentation fault, więc nie wiem o co chodzi.
> Czy ktoś ma jakiś pomysł?
>
> pozdrawiam
>
> Marek
Tutaj:
m.register_callback(t)
t jest obiektem klasy PyObject i nie wiem, czy nie powinieneś zmienić
sygnatury register_callback na:
void cppmodule::register_callback(PyObject* obj)
pzdr
Re: [boost.Python] Wołanie metod obiektów Pythona w c++
Author: Marek
Date: Fri, 06 Aug 2010 10:17
Date: Fri, 06 Aug 2010 10:17
15 lines
1305 bytes
1305 bytes
Dnia Fri, 06 Aug 2010 12:02:53 +0200, bbb napisał(a): > Tutaj: > > m.register_callback(t) > > t jest obiektem klasy PyObject i nie wiem, czy nie powinieneś zmienić > sygnatury register_callback na: > > void cppmodule::register_callback(PyObject* obj) boost::python::object jest "opakowaniem" PyObject i nawet w sobie ma właśnie wskaźnik na PyObject :) Poza tym w register_callback wywołanie metody obiektu pythona działa (nawet odpalilem sobie kilkukrotnie), dopiero potem coś się kopsa...:[
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads