Embedding Python in C
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Mon Jun 4 19:32:32 EDT 2007
En Mon, 04 Jun 2007 11:58:38 -0300, <mistabean at gmail.com> escribió:
> Onwards to the problem, I have been having difficulty embedding a
> python module into my C/C++ program. (just a test program before
> moving on into the real thing). I have been making test runs using the
> codes from http://docs.python.org/ext/pure-embedding.html as a basic,
> but modifiying it now as a function inside my C/C++ code.
>
> Problem started when I started passing an array as an argument. The
> module also need an array as an argument, but somehow I can't make
> them to go pass the "input-error checking" of the module.
>
> The code for argument building and calling are as follows:
>
> void CallSnake(char ModName[], char FuncName[], double result[])
> {
> ...
> /*Some operations to import modname, and preping FuncName, all is
> ok*/
> ...
> /*Processing the result array and calling the function, problem
> time*/
> pArgs = PyTuple_New(MAX_ELEMENT);
Should check for a NULL return value.
> pArg = PyList_New(1);
Same here.
> for (i = 0; i < MAX_ELEMENT; ++i)
> {
> pValue = Py_BuildValue("d", result[i]);
I'd use PyFloat_FromDouble here.
> PyTuple_SetItem(pArgs, i, pValue);
>
> if (!(*pArgs).ob_refcnt)
What do you expect from this? pArgs is a newly created tuple - unless you
DECREF it explicitely, ob_refcnt should never be 0. (Also, the -> operator
exists for exactly this usage).
> PyList_SetItem(pArg, 0, pArgs);
> pValue = PyObject_CallFunctionObjArgs(pFunc,pArg,NULL);
You didn't show us how you got pFunc here. Just to make it clear, you are
calling pFunc with a single argument, which is a list that contains a
single element, which is a tuple containing exactly MAX_ELEMENT float
objects.
> Traceback
> if x.ndim != 1; /*x is the input array, checking if it's a 1D*/
> AttributeError: 'list' object has no attribute 'ndim'
Python lists don't have a ndim attribute. Perhaps you want some kind of
Numeric array? (ndarray?)
> I have been trying many call variations, but alas, I think the problem
> lies in the list building process. I have no problems calling a non-
> arrayed (albeit,still single) argument.
Yes, it appears that you are building a plain list but your code is
expecting another kind of object. I'm unfamiliar with Numeric arrays, if
that is what you need; perhaps someone else can help, or ask again in a
Numeric-specific list.
--
Gabriel Genellina
More information about the Python-list
mailing list