0

PyArg_ParseTupleの正確なusgaeと思われるものを使用していますが、コードはまだ機能していません。私はPython2.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 "、arrayValue); printf( "horray!\ n"); }

コードでわかるように、リスト内の要素のタイプを確認すると、「int」が出力されます。しかし、何らかの理由でPyArg_ParseTupleにエラーが発生しています。

Pythonのリストから情報にアクセスしてデータをコピーし、それを他の場所のCコードに渡して、結果をPythonに返すことができる必要があります。

どうもありがとう!

4

2 に答える 2

2

答えは、使用することですlong PyInt_AsLong(PyObject *io)

"long PyInt_AsLong(PyObject *io)オブジェクトがまだ PyIntObject でない場合は、最初にオブジェクトを PyIntObject にキャストしようとし、その値を返します。エラーが発生した場合は -1 が返され、呼び出し元は PyErr_Occurred() をチェックして、エラーか、値がたまたま -1 だったかどうか。」

これはhttp://docs.python.org/2/c-api/int.htmlからのものです。これは、関連するすべてのメソッドを含む公式の c python int オブジェクト ドキュメントです。

残念ながら、これは長い値しか返しません。ただし、期待値が小さい場合は、単純なキャストで十分です。

于 2012-11-30T04:57:11.350 に答える
1

PyArg_ParseTuple()名前が示すように、タプルのみを解析することです。コードでitemは、はintであり、タプルではありません。オブジェクトをC値に変換するにはint、を使用する必要がありますarrayValue = PyInt_AsLong(item)longを返すのではなく、Cを返すことに注意してください。したがって、としてint宣言する必要があります。arrayValuelong

(編集:以前、誤ってPyInt_FromLongについて言及しました。)

于 2012-11-30T03:56:20.957 に答える