[C++-sig] Re: Creating an instance of a Python class in C++: PyRun_String?

David Abrahams dave at boost-consulting.com
Sun Nov 17 00:55:16 CET 2002


Dirk Gerrits <dirk at gerrits.homeip.net> writes:

> David Abrahams wrote:
>
>> >>Does
>> >>
>> >>   http://www.boost.org/libs/python/doc/v2/extract.html#examples
>> >>
>> >>help?
>> >
>> >I looked at that one, as I said in my initial post. However the
>> >example creates a new python::object instance of a wrapped C++
>> >class. Not of a Python class. Is there some way to create a class_
>> >object from a Python class that I'm not aware of?
>>
>>
>> No. However, if you can arrange to pass the class object from Python
>> to C++ in an object instance, you can avoid all of the problems you're
>> having with PyRun_String.
>
>
> This sounds very interesting! I don't know how to do it though. I'm
> very, very new to the Python/C API, if you hadn't guessed so
> already. ;) Can you give me some pointers on this one?

Urm, all I meant was:

void f(object class_object) // wrap this function
{
    object instance = class_object(param1, param2, ...);
    Base& = python::extract<Base&>(instance);
    ...
}

Pass the class from Python to the wrapped version of f().

> Check returns false and the extraction throws an exception:
> TypeError: No registered converter was able to extract a C++
> reference to type class Base from this Python object of type
> PythonDerived
>
>
> This reminded me of something I read in a post by Nicolas Lelong. He
> calls python::converter::initialize_builtin_converters() just after
> Py_Initialize(). So I tried that, but the linker complained:
>
> unresolved external symbol "void __cdecl
> boost::python::converter::initialize_builtin_converters(void)"
>
> Any idea why that might be?

Because it's not an exported symbol. He was probably linking
Boost.Python's sources directly into his application, or was using
Unix.

You could try something like:

    #include <boost/python/converter/registry.hpp>
     ...
    boost::python::converter::registry::query(type_id<int>())

Which will call that function.

When we get embedding support officially set up, you won't have to
resort to this sort of hack anymore.

-- 
                       David Abrahams
   dave at boost-consulting.com * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution





More information about the Cplusplus-sig mailing list