1

http://mail.python.org/pipermail/python-dev/2009-June/090210.html およびhttp://dan.iel.fm/posts/python-c-extensions/を参照

ここに私の質問に関して検索した他の場所があります: http://article.gmane.org/gmane.comp.python.general/424736 http://joyrex.spc.uchicago.edu/bookshelves/python/cookbook/pythoncook- CHP-16-SECT-3.html http://docs.python.org/2/c-api/sequence.html#PySequence_Check 可変数の引数を持つ Python 拡張モジュール

私は Python/C API の経験がありません。

次のコードがあります。

sm_int_list = (1,20,3)
c_int_array = (ctypes.c_int * len(sm_int_list))(*sm_int_list)
sm_str_tuple = ('some','text', 'here')

C拡張側では、次のようなことをしました:

static PyObject* stuff_here(PyObject *self, PyObject *args)
{
    char* input;
    int *i1, *i2;
    char *s1, *s2;
    // args = (('some','text', 'here'), [1,20,3], ('some','text', 'here'), [1,20,3])
    **PyArg_ParseTuple(args, "(s#:):#(i:)#(s#:):#(i:)#", &s1, &i1, &s2, &i2)**;
/*stuff*/
}

そのようなもの: stuff.here(('some','text', 'here'), [1,20,3], ('some','text', 'here'), [1,20,3] )

何らかの計算の後、args と同じ形式でデータを返します。PyArg_ParseTuple 式を知りたいのですが、解析する適切な方法ですか?

  1. 可変文字列の配列
  2. 整数の配列

更新 NEW

これは正しい方法ですか?:

static PyObject* stuff_here(PyObject *self, PyObject *args)
    unsigned int tint[], cint[];
    ttotal=0, ctotal=0;
    char *tstr, *cstr;
    int *t_counts, *c_counts;
    Py_ssize_t size;
    PyObject *t_str1, *t_int1, *c_str2, *c_int2; //the C var that takes in the py variable value
    PyObject *tseq, cseq;
    int t_seqlen=0, c_seqlen=0;

if (!PyArg_ParseTuple(args, "OOiOOi", &t_str1, &t_int1, &ttotal,  &c_str2, &c_int2, &ctotal))
    {
        return NULL;
    }

if (!PySequence_Check(tag_str1) && !PySequence_Check(cat_str2)) return NULL;

    else:
    {
        //All things t
        tseq = PySequence_Fast(t_str1, "iterable");
        t_seqlen = PySequence_Fast_GET_SIZE(tseq);
        t_counts = PySequence_Fast(t_int1);

        //All things c
        cseq = PySequence_Fast(c_str2);
        c_seqlen = PySequence_Fast_GET_SIZE(cseq);
        c_counts = PySequence_Fast(c_int2);

        //Make c arrays of all things tag and cat
        for (i=0; i<t_seqlen; i++)
        {
            tstr[i] = PySequence_Fast_GET_ITEM(tseq, i);
            tcounts[i] = PySequence_Fast_GET_ITEM(t_counts, i);
        }

        for (i=0; i<c_seqlen; i++)
        {
            cstr[i] = PySequence_Fast_GET_ITEM(cseq, i);
            ccounts[i] = PySequence_Fast_GET_ITEM(c_counts, i);
        }


    }

また

PyArg_ParseTuple(args, "(s:)(i:)(s:)(i:)", &s1, &i1, &s2, &i2)

そしてまた帰りながら、

Py_BuildValue("sisi", arr_str1,arr_int1,arr_str2,arr_int2)??

実際、誰かがさまざまな PyArg_ParseTuple 関数を詳細に明確にすることができれば、非常に有益です。ドキュメントにあるように、Python C APIは、やるべきことに関するチュートリアルではありません。

4

1 に答える 1

1

PyArg_ParseTuple を使用して、固定構造を持つ実際のタプルを解析できます。特にサブタプルの項目数は変更できません。

2.7.5 のドキュメントにあるように、"(s#:):#(i:)#(s#:):#(i:)#": はネストされた括弧内に出現できないため、形式が間違っています。format"(sss)(iii)(sss)(iii)"は、合計 12 個のポインター引数とともに、引数と一致する必要があります。同様に、Py_BuildValue の場合、同じフォーマット文字列 (1 つのタプル内に 4 つのタプルを作成する) を使用する"(sss)[iii](sss)[iii]"か、タイプが重要な場合 (これにより整数がタプルではなくリストになります) を使用できます。

于 2013-08-04T17:21:04.090 に答える