[C++-sig] Reinitialization of interpreter with Boost.Python

Maciej Sobczak prog at msobczak.com
Wed Apr 7 10:58:27 CEST 2004


Hi,

I use Boost.Python (from 1.30.2 release) for interpreter embedding.
The idea is to run short, customized scripts from within the C++ 
application and have the scripts operate on application's data structures.

My use of Python interpreter is tightly scoped and what I need is the 
possibility to *repeatedly* do the following:

1. initialize the interpreter
2. import module defined in the application's code
3. execute some Python script
4. finalize the interpreter

The problem is that the second time (after the interpreter is 
re-initialized) my module is imported, the code that defines classes 
cannot go past the registration procedure.
This is due to the fact that the slots for conversion functions cannot 
be reused and the code stumbles either on assertion (in Debug build) or 
the exception is thrown (in Release build).
The "offending" code is in the converter/registry.cpp file (of 
Boost.Python):

void insert(to_python_function_t f, type_info source_t)
{
#  ifdef BOOST_PYTHON_TRACE_REGISTRY
     std::cout << "inserting to_python " << source_t << "\n";
#  endif
     to_python_function_t& slot = get(source_t)->m_to_python;

     assert(slot == 0); // we have a problem otherwise
     if (slot != 0)
     {
         throw std::runtime_error(
             "trying to register to_python_converter for a type which 
already has a registered to_python_converter");
     }
     slot = f;
}

Considering the fact that what I need is the possibility to reinitialize 
the interpreter in exactly the same manner, importing the same module 
that defines the same classes - the second time the module is imported, 
the converion function is exactly the same.

I have hacked the above function and removed both assertion and if, so 
that the conversion function pointer is always written into the slot.
The second time my module is imported (after the interpreter is 
finalized and re-initialized), the insert function above will just 
overwrite the slot with the same value as before.
Interestingly, it started to work as expected, at least with simple tests.

What bothers me is the claim I found on Boost site, that 
reinitialization of Python interpreter is *not* supported due to the 
reference-counting problems affecting some global objects.
I do not experience any problems *at the moment*, but I would like to 
know where the trolls may come from.

What is exactly the problem? What should I be aware of?

Thank you very much for your time,

-- 
Maciej Sobczak : http://www.msobczak.com/
Programming    : http://www.msobczak.com/prog/





More information about the Cplusplus-sig mailing list