Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Python C API, building a module

3 views
Skip to first unread message

MRAB

unread,
Nov 27, 2009, 10:25:15 PM11/27/09
to pytho...@python.org
P.F.C. wrote:
> Hello, I'm new to the mailing list but have been using python for a while.
>
> I am now attempting to embed the interpreter into a C application but am
> having an issue when building a module exposing my application's
> functions to python.
> I do not know if this is the right place to ask for help with it, if it
> isn't then please let me know where to go.
>
> the problem I'm having is with making a PyMethodDef array
> When I make the array like this it works:
>
> static PyMethodDef ge_methods[]={
> {"test",ge_test,METH_NOARGS,"Test returns 123L"},
> {NULL,NULL}
> };
>
> but as soon as I try to build the array from constant variables like this:
>
> const int ge_test_args = METH_NOARGS; //The flag
> for this function
> const char* ge_test_doc = "Test\nwill print \"test\""; //The
> docstring
> static PyMethodDef ge_methods[]={
> {"test",ge_test, ge_test_args, ge_test_doc}, //simply
> replacing the flag and the docstring with a constant variable
> {NULL,NULL}
> };
>
> the compiler then gives the following errors:
> ./test1.c:74: error: initializer element is not constant
> ./test1.c:74: error: (near initialization for �ge_methods[0].ml_flags�)
> ./test1.c:74: error: initializer element is not constant
> ./test1.c:74: error: (near initialization for �ge_methods[0].ml_doc�)
>
> I'm using the gcc compiler
>
> This may well be because of my lack of understanding the C language but
> I was hoping someone could help me out, or at least point me in the
> right direction
>
> I also posted about this at
> http://talk.christiandevs.com/viewtopic.php?f=13&t=2521
> <http://talk.christiandevs.com/viewtopic.php?f=13&t=2521>
>
I think it's because C 'const' objects aren't true constants, but are
more like read-only variables; you can initialise them in the
declaration but not assign to them otherwise. Thus what you're actually
trying to do is initialise from a variable, not a constant.

MRAB

unread,
Nov 27, 2009, 11:17:17 PM11/27/09
to pytho...@python.org
P.F.C. wrote:
> I see what your saying.
>
> Is there another way of declaring (at least) the docstring apart from
> the actual array?(it would get messy otherwise)
>
> I had also tried defining the variables as static but got the same
> result (I thought static meant in code memory instead of the heap...?)
>
> I am new to C so I may just be going about this all wrong...
>
The standard way of providing documentation strings is with PyDoc_STRVAR:

const int ge_test_args = METH_NOARGS; //The flag
for this function

PyDoc_STRVAR(ge_test_doc, "Test\nwill print \"test\""); //The

docstring
static PyMethodDef ge_methods[]={

{"test", NULL, 0, ge_test_doc}, //simply replacing the

flag and the docstring with a constant variable
{NULL,NULL}
};

>
> -- Maranatha!
> ---------------------------------
> PFC aka Fezzik aka GAB

0 new messages