Trying to embed python into C, help!
aleax at aleax.it
Sun Aug 10 17:01:07 CEST 2003
> I've been looking at using python and it's been going fairly well so far,
> i can call C from python and python from C fine but now i've hit a snag
> and i'm wondering how you guys have got around it.
To be honest, I'm having some trouble understanding exactly what
your snag IS.
> I have to initialise python inside my C project so that i can make calls
> to python modules whenever i need to but i can't create a dll for the
> project as it's got to produce an exe or at least a lib so that i can
> execute the initialisation code.
...but why ever would you WANT to "create a dll" and what does THAT have
to do with "initializing Python"...?
> The only way around it would seem to be to create a
> separate dll project containing the python callback code that can then
> import it to python and have my C code load it too. The problem with this
I'm trying to guess, from this sentence, that you labor under a
mis-apprehension that your C code, which embeds Python, can only
provide "Python extension modules" by supplying them as a separate
DLL. Is that what you mean by "the python callback code that can then
import it to python"...? Sorry if my guess is way off, but really I
find this sentence unparsable and incomprehensible.
Anyway, if that's your 'snag', rest assured that there is no such
need. Your C program can extend Python, creating modules that
Python code can import, without any DLL whatsoever. For example,
get the source distribution of Python [I don't think the demos
come with e.g. the Windows installer binary] and look at source
file Demo/embed/demo.c -- you'll see it adds to Python, as a
static module, a module 'xyzzy' from which Python code could
import and call, without arguments, a function 'foo'. Unfortunately
the Python code executed in the demo doesn't show that ability
being used, but at least you'll see 'xyzzy' listed among the
"builtin modules"; just add two lines such as:
PyRun_SimpleString("print 'the answer is', xyzzy.foo()\n");
among the other calls to PyRun_SimpleString, and you'll see it work.
More information about the Python-list