Trying to embed python into C, help!

Alex Martelli aleax at aleax.it
Sun Aug 10 11:01:07 EDT 2003


disgracelands wrote:

> 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("import xyzzy\n");
        PyRun_SimpleString("print 'the answer is', xyzzy.foo()\n");

among the other calls to PyRun_SimpleString, and you'll see it work.


Alex






More information about the Python-list mailing list