Problem with embedding AND extending with BOOST
Alexander Gavrilov
agavrilov at home.com
Thu Jun 7 13:21:29 EDT 2001
Your error message makes me think that you have to enable Run-Time Type
Information. Go to Project -> Settings... -> C/C++ -> C++ Language and check
"Enable Run-Time Type Information (RTTI)" checkbox. Hopefully it'll help.
--
Alexander Gavrilov
Brainbench MVP for C++
http://www.brainbench.com
"Emmanuel Astier" <emmanuel.astier at winwise.fr> wrote in message
news:c700d3a2.0106070742.6e225819 at posting.google.com...
> Hi,
>
> I'm quite new to python, and try to extend/embed it (under
> Windows/VC6)
>
> To extend it, I'm using the BOOST python library.
>
> But I have a problem whenever I want to import a class and use it.
>
> Here's my code :
>
> ----------------------------------------------
> main.c :
> ----------------------------------------------
> namespace hello {
>
> class world
> {
> public:
> world(int) {}
> ~world() {}
> int get() const { return 5; }
> };
>
>
> size_t length(const int& x) { return x;}
> }
>
> #include <boost/python/class_builder.hpp>
>
> // Python requires an exported function called init<module-name> in
> every
> // extension module. This is where we build the module contents.
> extern "C"
> #ifdef _WIN32
> __declspec(dllexport)
> #endif
> void inithello()
> {
> try
> {
> // create an object representing this extension module
> boost::python::module_builder hello("hello");
>
> // Create the Python type object for our extension class
> boost::python::class_builder<hello::world> world_class(hello,
> "world");
>
> // Add the __init__ function
> world_class.def(boost::python::constructor<int>());
> // Add a regular member function
> world_class.def(&hello::world::get, "get");
>
> // Add a regular function to the module
> hello.def(hello::length, "length");
> }
> catch(...)
> {
> boost::python::handle_exception(); // Deal with the exception for
> Python
> }
> }
>
>
>
> void main()
> {
> PyObject* modname, * mod, *func, *mdict;
> long Answer;
>
> Py_Initialize();
> inithello();
> modname = PyString_FromString("Totohello");
> mod = PyImport_Import(modname);
> // Initialisation et verification de Python :
> if (mod)
> {
> Answer = 1;
> mdict = PyModule_GetDict(mod);
> func = PyDict_GetItemString(mdict, "MyFunction");
> if ( func )
> {
> Answer = 2;
> if ( PyCallable_Check(func) )
> {
> PyObject* rslt;
> rslt = PyObject_CallFunction(func, "i", 5);
> if (rslt)
> {
> Answer = PyInt_AsLong(rslt);
> Py_XDECREF(rslt);
> }
> else
> {
> PyErr_Print();
> Answer = 3;
> }
> }
> }
> }
> printf("Answer : %i", Answer );
> Py_XDECREF ( mod );
> Py_XDECREF(modname);
> Py_Finalize();
> }
>
> ----------------------------------------------
> Totohello.py :
> ----------------------------------------------
> def ChangeFov(a):
> from hello import *
> MyInst = world(2)
> #print MyInst.get() <- Crash when uncommented !
> val = length(5)
> return 14 + val
>
>
>
> The linker report 2 errors, one of those is :
> :\dev\boost\boost_1_22_0\boost\python\detail\extension_class.hpp(225)
> : warning C4541: 'dynamic_cast' used on polymorphic type 'class
> boost::python::detail::instance_holder_base' with /GR-; unpredictable
> behavior may result
>
d:\dev\boost\boost_1_22_0\boost\python\detail\extension_class.hpp(218)
> : while compiling class-template member function 'class hello::world
> *__cdecl boost::python::python_extension_class_converters<class
> hello::world,class boost::python::det
> ail::held_instance<class hello::world> >::non_null_from_python(struct
> _object *,struct boost::python::type<class hello::world *>)'
>
> and effectively, it crashes in the "non_null_from_python" function...
>
>
> As someone suceeded in extended AND embedding python using BOOST ?
>
> Thanks for any help,
>
> Emmanuel
More information about the Python-list
mailing list