[C++-sig] Re: location of initialization matters?
Martin Blais
blais at iro.umontreal.ca
Tue Sep 23 20:05:04 CEST 2003
just a follow up on this: I was able to recreate the scope object for
my module by import "itself" from the project's init framework, which is
executed after the Python initMODULE function is called, and since at
that point the module has had its Py_InitModule() called, I assume that
doing a PyImport_ImportModuleEx() after that won't have any other
consequences. Here is the relevant code::
InInit<DlInit::pyextModuleA>::performInitialize()
{
... initialize buff here
{
using namespace python;
// Obtain the handle on the already imported module to create a
// scope.
PyObject* m = ::PyImport_ImportModuleEx( "libDLpyextModuleA",
0, 0, 0 );
assert( m != 0 );
scope module_scope( object( borrowed<PyObject>( m ) ) );
// Boost.Python declarations using initialized objects here.
module_scope.attr( "buff" ) = buff;
}
}
This "seems to work" (i.e. it compiles and doesn't crash and I can
obtain the correct initialized value for the initialized buff).
I think with this in mind, I could probably leave the initMODULE
functions empty and always put my Boost.Python declarations in the
project's performInitialize() methods.
Do you see any potential problems with this? I'm sure some other
projects must have had to do a similar trick.
I guess my question boils down to: "can one safely declare new things
for Python once the module has already been initialized?" (i.e. by
"declare new things" I mean insert Boost.Python declarations, for
example, could I declare a new class within a function call? (i.e not
the initMODULE function))
More information about the Cplusplus-sig
mailing list