[C++-sig] Re: Converting a C++ object to python
Raoul Gough
RaoulGough at yahoo.co.uk
Mon Sep 15 13:02:02 CEST 2003
"Ron Penton" <rpenton at adelphia.net> writes:
>>If you catch a boost::python::error_already_set in C++, I guess you
>>can get more information by calling PyErr_Print(), which should dump a
>>standard Python traceback on stderr. At a guess, you're getting a
>>Python TypeError from the object constructor, because it doesn't have
>>a converter for booga *. BTW, why are you passing a pointer to b,
>>instead of a reference?
>
> PyErr_Print says "TypeError: No Python class registered for C++ class class
> booga",
> which confirms what you thought.
Well, not really - I would have thought that there is a problem with
booga * (i.e. pointer to booga), but from your error message, that is
not the case. I don't suppose it makes any difference to use b instead
of &b then?
>
> The part that confuses me is the converter part; I'm not quite sure how to
> go about creating one. All of the examples I can find go about the creation
> of the python types manually, rather than using the class_ definition, so
> I'm really unsure of where to go from here.
Well, we've now snipped the original code, but looking back at it from
your original post:
> class booga{public:
> booga() : a( 0 ) {} int a; void
> looga() { a = a + 10; cout << a << endl; }};
> BOOST_PYTHON_MODULE( wrap ){ class_<booga>( "booga"
> ) .def( "looga", &booga::looga
> );}
> int main(){ Py_Initialize();
>
> PyImport_AppendInittab(
> "wrap", initwrap );
> booga b;
> object obj( &b );
the class_<booga> constructor should handle all of the converter
registration. However, I know that at least *some* of the registration
is done at run-time. I'm not sure whether that applies to the
to-python converters or not (I would guess not, actually). Anyway, why
not add some std::cout in the BOOST_PYTHON_MODULE function to make
sure that it is actually being run (especially given the doubt about
using PyImport_AppendInittab)
>
>
>>I don't have any experience embedding Python in C++, because I work
>>the other way around (i.e. using C++ extensions from within Python).
>>However, the documentation for PyImport_AppendInittab says that you
>>should call it *before* Py_Initialize. I would have thought you want a
>>normal import of your module anyway, rather than trying to make it act
>>like a built-in.
>
> It works either way. For the time being I'm just playing around trying to
> see what can be done.
You mean it runs initwrap either way? If that is the case, I'm really
not sure what else I can suggest. I don't actually understand how the
object constructor is supposed to know what to do with a raw C++
reference (or pointer for that matter) since it doesn't know whether
to copy the C++ object or wrap a refrence to it. This is normally all
handled by the "def" function, where you pass it a return policy
specifying the copy or reference behaviour.
--
Raoul Gough.
(setq dabbrev-case-fold-search nil)
More information about the Cplusplus-sig
mailing list