2011-10-11 11 views
8

देता है मैं समझने की कोशिश कर रहा हूं कि पाइथन सी-एपी कैसे काम करता है, और मैं पाइथन और सी एक्सटेंशन के बीच numpy arrays का आदान-प्रदान करना चाहता हूं।न्यूम्पी सी-एपी उदाहरण एक सेगफॉल्ट

तो, मैं इस ट्यूटोरियल शुरू किया: http://dsnra.jpl.nasa.gov/software/Python/numpydoc/numpy-13.html

पहला उदाहरण वहाँ एक सी मॉड्यूल है कि एक 2d numpy सरणी का पता लगाने की गणना करता है ऐसा करने के लिए, की कोशिश की, मेरे लिए बहुत साफ था, के बाद से मैं प्राथमिक संचालन करना चाहते हैं 2 डी सरणी में भी।

#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]) 

फ़ाइल संकलित किया गया है, trace.so IPython में आयात किया जाता है, लेकिन जब मैं इस्तेमाल करने की कोशिश विधि ट्रेस(), मुझे एक सेगमेंटेशन फॉल्ट मिलता है, मुझे नहीं पता क्यों।

मैं फेडोरा 15, पायथन 2.7.1, जीसीसी 4.3.0 के साथ इस चलाने के लिए, Numpy 1.5.1

+0

ध्यान दें कि आपके द्वारा अनुसरण किए जाने वाले ट्यूटोरियल * न्यूमेरिक * के लिए है, पुरानी लाइब्रेरी वर्तमान नम्पी द्वारा अधिग्रहण की गई है। बेवकूफ * ज्यादातर * इसके पीछे पिछड़ा संगत है, लेकिन पूरी तरह से नहीं। (हां, भी * संख्यात्मक * को अनौपचारिक रूप से "नम्पी" कहा जाता था, जो भ्रम की ओर जाता है ...) –

+0

फिर, क्या मुझे 'शामिल करना चाहिए" Numpy/arrayobject.h' इसके बजाय? –

उत्तर

15

मॉड्यूल के लिए आपका init समारोह कॉल करने के लिए की जरूरत है

import_array(); 

के बाद

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

यह शीर्ष के निकट ट्यूटोरियल में इसका उल्लेख करता है, लेकिन यह याद करना आसान है। इसके बिना, यह PyArray_ContiguousFromObject पर segfaults।

+0

बहुत बहुत धन्यवाद! हाँ, मैं शुरुआती समझने में कठिन समय था। यह एक आकर्षण की तरह काम करता है। –

+0

वाह। मैं इस पर अपना सिर तोड़ रहा था! धन्यवाद –

संबंधित मुद्दे