0

我使用的似乎是 PyArg_ParseTuple 的确切用法,但代码仍然无法工作。我正在使用 python 2.7

这是我正在编写的 Python 扩展的 C 代码:

static PyObject* tpp(PyObject* self, PyObject* args)
{
PyObject* obj;
PyObject* seq;
int i, len; 
PyObject* item;
int arrayValue, temp;

if (!PyArg_ParseTuple(args, "O", &obj)){
    printf("Item is not a list\n");
    return NULL;
}
seq = PySequence_Fast(obj, "expected a sequence");
len = PySequence_Size(obj);
arrayValue = -5;
printf("[\n");
for (i = 0; i < len; i++) {
    item = PySequence_Fast_GET_ITEM(seq, i);
    // printf("%d : %d, PyArg: ", item, *item);
    // PyArg_ParseTuple(item, "I", &temp);

    PyObject* objectsRepresentation = PyObject_Repr(item);
    const char* s = PyString_AsString(objectsRepresentation);
    printf("%s\n", s);


    PyObject* objType = PyObject_Type(item);
    PyObject* objTypeString = PyObject_Repr(objType);
    const char* sType = PyString_AsString(objTypeString);
    printf("%s\n", sType);

    if (PyArg_ParseTuple(item, "i", &arrayValue) != 0){
        printf("%d\n", arrayValue);
        printf("horray!\n");
    } 
}
Py_DECREF(seq);
printf("]\n");
printf("Item is a list!\n");
Py_RETURN_NONE;
}

然后我只是构建扩展并转到终端 import et 然后 et.tpp([1,2]) 无法打印该行 if (PyArg_ParseTuple(item, "i", &arrayValue) != 0){ printf(" %d\n", 数组值); printf("万岁!\n"); }

正如您在代码中看到的那样,我检查了列表中元素的类型,并打印了“int”。然而由于某种原因 PyArg_ParseTuple 有错误。

我需要能够从 python 中的列表中访问信息以复制一些数据,将其传递给其他地方的 C 代码,然后将结果返回给 python。

非常感谢!

4

2 回答 2

2

答案是使用long PyInt_AsLong(PyObject *io)

"long PyInt_AsLong(PyObject *io)将首先尝试将对象转换为 PyIntObject,如果它还不是一个,然后返回它的值。如果有错误,则返回 -1,调用者应检查 PyE​​rr_Occurred() 以确定是否存在一个错误,或者该值是否恰好是-1。”

这是来自http://docs.python.org/2/c-api/int.html这是官方的 c python int objects 文档,其中包含所有相关方法。

不幸的是,这只返回一个长值。但是,如果预期值很小,一个简单的强制转换就足够了。

于 2012-11-30T04:57:11.350 回答
1

PyArg_ParseTuple()顾名思义,就是只解析元组。在您的代码中,item是一个 int,而不是一个元组。为了将int对象转换为 C 值,您需要使用arrayValue = PyInt_AsLong(item). 请注意,它返回一个 C long,而不是一个int,所以你应该声明arrayValue为一个long

(编辑:之前我错误地提到了 PyInt_FromLong。)

于 2012-11-30T03:56:20.957 回答