2016-06-21 24 views
2

Cで単なるNumpy配列を読み込んでクラッシュするシンプルなPython拡張関数を書きました。Numpy配列でPyArg_ParseTupleを呼び出すとクラッシュする

l = np.array([1,2,3,1,2,2,1,3]) 

print("%d" % extension.test(l)) 

私のコードの何が問題なのです。ここで

static PyObject *test(PyObject *self, PyObject *args) 
{ 
    PyArrayObject *array = NULL; 

    if (!PyArg_ParseTuple(args, "O!", &PyArray_Type, &array)) // Crash 
     return NULL; 

    return Py_BuildValue("d", 0); 
} 

は、それが呼ばれる方法ですか?あなたのモジュールのinit関数でimport_array()を呼び出すために覚えています:

答えて

3

私はエラーがあなたの例では含まれていませんでしたコードであると思い

...このサブルーチンは(import_arrayへの呼び出しをも含まれている必要があります)および/またはimport_ufunc()を使用する必要があります。これらのコマンドを置くことを忘れると、実際にC-APIサブルーチンが呼び出されるとすぐに醜いセグメンテーションフォールト(クラッシュ)として表示されます。

http://docs.scipy.org/doc/numpy-1.10.1/user/c-info.how-to-extend.html#required-subroutine

私は逐語的なあなたの例をコピーして(のpython 3を使用)を加え

PyMODINIT_FUNC 
PyInit_numpytest(void) 
{ 
    import_array(); 
    return PyModule_Create(&numpytest); 
} 

と例は問題なく走りました。一方でコールを削除すると、クラッシュが発生します。

+0

ありがとうございます、それはもうクラッシュしません!この命令コールは、私が読んだほとんどのチュートリアルにはありませんでした。 –

関連する問題