Python C API, building a module

MRAB python at mrabarnett.plus.com
Fri Nov 27 23:17:17 EST 2009


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
> 
> 
> On Fri, Nov 27, 2009 at 10:25 PM, MRAB <python at mrabarnett.plus.com 
> <mailto:python at mrabarnett.plus.com>> wrote:
> 
>     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>
>         <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.
> 




More information about the Python-list mailing list