2011-10-11 8 views
8

私はPython C-Apiの仕組みを理解しようとしており、PythonとC Extensionの間でnumpy配列を交換したいと考えています。Numpy C-Apiの例はSegFaultを与えます

だから、私はこのチュートリアルを開始しました:http://dsnra.jpl.nasa.gov/software/Python/numpydoc/numpy-13.html

が最初の例を実行しようとしました、2D numpyの配列のトレースを計算Cモジュール、私は基本演算をしたいから、私にとって非常にきれいでした2d配列でも同様です。

#include <Python.h> 
#include "Numeric/arrayobject.h" 
#include<stdio.h> 

int main(){ 
Py_Initialize(); 
import_array(); 
} 

static char doc[] = 
"This is the C extension for xor_masking routine"; 

    static PyObject * 
    trace(PyObject *self, PyObject *args) 
    { 
    PyObject *input; 
    PyArrayObject *array; 
    double sum; 
    int i, n; 

    if (!PyArg_ParseTuple(args, "O", &input)) 
    return NULL; 
    array = (PyArrayObject *) 
    PyArray_ContiguousFromObject(input, PyArray_DOUBLE, 2, 2); 
    if (array == NULL) 
    return NULL; 

    n = array->dimensions[0]; 
    if (n > array->dimensions[1]) 
    n = array->dimensions[1]; 
    sum = 0.; 
    for (i = 0; i < n; i++) 
    sum += *(double *)(array->data + i*array->strides[0] + i*array->strides[1]); 
    Py_DECREF(array); 
    return PyFloat_FromDouble(sum); 
    } 

static PyMethodDef TraceMethods[] = { 
    {"trace", trace, METH_VARARGS, doc}, 
    {NULL, NULL, 0, NULL} 
}; 

PyMODINIT_FUNC 
inittrace(void) 
{ 
    (void) Py_InitModule("trace", TraceMethods); 
} 


} 

モジュールの名前は、トレースであり、それはsetup.pyファイルにコンパイルされます。ファイルがコンパイルされ

from distutils.core import setup, Extension 

module = Extension('trace', sources = ['xor_masking.cpp']) 
setup(name = 'Trace Test', version = '1.0', ext_modules = [module]) 

、IPythonでtrace.soインポートされますが、私は使用しようとすると、メソッドtrace()は、Segmentation Faultを取得しますが、理由はわかりません。私はFedoraの15、Pythonの2.7.1、GCC 4.3.0でこれを実行

、numpyの1.5.1モジュールのためのあなたのinit関数を呼び出す必要がある

+0

次のチュートリアルは、現在のNumpyによって置き換えられた* Numeric *のライブラリです。 Numpyはほとんど*後方互換性がありますが、完全ではありません。 (はい、また* Numeric *は非公式に "Numpy"と呼ばれ、混乱を招く...) –

+0

'#include" Numpy/arrayobject.h' 代わりに –

答えて

15

import_array(); 

(void) Py_InitModule("trace", TraceMethods); 

これは上のチュートリアルでこれを言いますが、見逃しやすいです。これがなければ、PyArray_ContiguousFromObjectにsegfaultsします。

+0

ありがとうございました! それは魅力のように機能します –

+0

うわー、これ以上頭を痛めていました!ありがとう –

関連する問題