Embedding Python in C
gagsl-py2 at yahoo.com.ar
Tue Jun 5 01:32:32 CEST 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
> /*Processing the result array and calling the function, problem
> pArgs = PyTuple_New(MAX_ELEMENT);
Should check for a NULL return value.
> pArg = PyList_New(1);
> 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
> 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
More information about the Python-list