0

私は自分の拡張機能からac関数を呼び出そうとしていますが、問題をこのテストケースに絞り込みました。

#import "Python.h"

...

// Called from python with test_method(0, 0, 'TEST')
static PyObject*
test_method(PyObject *args)
{
    int ok, x, y, size;
    const char *s;

    // this causes Segmentation fault
    //ok = PyArg_ParseTuple(args, "iis#", &x, &y, &s, &size); 

    // also segfaults
    //if(ok) PyErr_SetString(PyExc_SystemError, 'Exception');

    // this does not cause segfault but fills the variables with garbage   
    ok = PyArg_ParseTuple(&args, "iis#", &x, &y, &s, &size);

    // Example: >test_method 0, 37567920, (garbage)
    printf(">test_method %d, %d, %s\n", x, y, s);

    /* Success */
    Py_RETURN_NONE;
}

static PyMethodDef testMethods[] =
{
     {"test_method", test_method, METH_VARARGS,
             "test_method"},
     ...

     {NULL, NULL, 0, NULL}
};

私が間違っているかもしれないアイデア。(Pythonバージョン2.6.4)。

4

1 に答える 1

1

うーん。メソッドのシグネチャは次のようになります。

static PyObject* test_method(PyObject* self, PyObject* args)

test_methodバインドされたメソッド(つまり、オブジェクトインスタンスのメソッド)としてを呼び出す場合はself、オブジェクト自体になります。test_methodがモジュール関数の場合、selfはモジュールを初期化したときに渡されるポインタPy_InitModule4()です(またはを使用した場合はNULL Py_InitModule())。Pythonは、バインドされたインスタンスメソッドと通常の関数をコードレベルで区別しないselfため、プレーンな関数を実装している場合でもパスする必要があります。

詳細については、このページを参照してください。

于 2010-06-30T09:25:13.420 に答える