[C++-sig] Re: boost:python:embedding
Dirk Gerrits
dirk at gerrits.homeip.net
Sun May 4 13:15:42 CEST 2003
David Abrahams wrote:
> Dirk Gerrits <dirk at gerrits.homeip.net> writes:
>
>
>>David Abrahams wrote:
>>
>>>Dirk Gerrits <dirk at gerrits.homeip.net> writes:
>>
>>You'll have to teach me how to write the reference material,
>>though. That is, I assume it's not hand-written HTML?
>
>
> Sadly, no. One day we'll use BoostBook generation, but 'till then,
> you just copy one of the templates
> (e.g. http://www.boost.org/libs/python/doc/v2/header.html) and go
> from there.
Okay, will do.
>>For the tests I can just use
>>
[code snipped]
>>as in embedding.cpp right?
>
>
> Seems likely, but I'm not certain what you need to do for the tests
> you want to run.
Well nothing too fancy I think.
>>That shouldn't be too hard.
>>
>>
>>I'd like to stress again though, that my current solution is pretty
>>basic. I really have no use for multiple interpreters
>
>
> Most people don't, it turns out.
Well then, I'll get my code boostified. :)
>>, or multiple Python-using threads at the moment. If anyone else
>>does, and wants to see it addressed in Boost.Python, I encourage
>>them to post their code and extra testcases here.
>
>
> That's the spirit!
Boost.Spirit? :P
Seriously though, I have some more questions.
When you are embedding Python in a C++ program, your Python code may
need to call C++ code in the embedding program. (At least, that's what I
currently need to do.) To do this, you can't simply create a
module_name.so or module_name.pyd as you'd do when extending; the BPL
wrapper code must be in the C++ program itself. To make the module
available to Python, you must call a function like
PyImport_AppendInittab (or interpreter::add_module which I just whipped
up ;)). The parameters to this call are the module name and the init
function. Herein lies the problem. If the module is in a different
compilation unit than the code using the interpreter one must forward
declare the init function. Is there currently a way to do this safely?
Perhaps a macro like the following?
#if (defined(_WIN32) || defined(__CYGWIN__)) &&
!defined(BOOST_PYTHON_STATIC_MODULE)
# define BOOST_PYTHON_FORWARD_DECLARE_MODULE_INIT(name) \
extern "C" __declspec(dllexport) void init##name();
#else
# define BOOST_PYTHON_FORWARD_DECLARE_MODULE_INIT(name) \
extern "C" void init##name()
#endif
I have some issues with this though. For starters, the macro name is
much too long for my taste. ;) Furthermore, I doubt if it makes sense to
do this sort of embedding without defining BOOST_PYTHON_STATIC_MODULE.
Which brings me to my last question.
There used to be a bug which caused a 'Fatal Python error' upon
Py_Finalize when doing this kind of embedding. But when I ran into that,
there was no BOOST_PYTHON_STATIC_MODULE. Now, with
BOOST_PYTHON_STATIC_MODULE I haven't been able to replicate it. Has it
been fixed then?
Dirk Gerrits
More information about the Cplusplus-sig
mailing list