2010-11-06 17 views
7

मैं एक सी फ़ंक्शन के लिए एक अजगर रैपर लिखने की कोशिश कर रहा हूं। सभी कोड लिखने के बाद, और इसे संकलित करने के बाद, पायथन मॉड्यूल आयात नहीं कर सकता है। मैं here दिए गए उदाहरण का पालन कर रहा हूं। कुछ टाइपो को ठीक करने के बाद, मैं इसे यहां पुन: उत्पन्न करता हूं। वहाँ एक फ़ाइल myModule.c है:.so मॉड्यूल पायथन में आयात नहीं करता है: गतिशील मॉड्यूल init फ़ंक्शन को परिभाषित नहीं करता

#include <Python.h> 

/* 
* Function to be called from Python 
*/ 
static PyObject* py_myFunction(PyObject* self, PyObject* args) 
{ 
    char *s = "Hello from C!"; 
    return Py_BuildValue("s", s); 
} 
/* 
* Bind Python function names to our C functions 
*/ 
static PyMethodDef myModule_methods[] = { 
    {"myFunction", py_myFunction, METH_VARARGS}, 
    {NULL, NULL} 
}; 

/* 
* Python calls this to let us initialize our module 
*/ 
void initmyModule() 
{ 
    (void) Py_InitModule("myModule", myModule_methods); 
} 

जब से मैं एक मैक macports साथ अजगर पर हूँ, मैं इसे के रूप में

$ g++ -dynamiclib -I/opt/local/Library/Frameworks/Python.framework/Headers -lpython2.6 -o myModule.dylib myModule.c 
$ mv myModule.dylib myModule.so 

संकलन हालांकि, जब मैं इसे आयात करने की कोशिश मैं कोई त्रुटि मिलती है।

$ ipython 
In[1]: import myModule 
--------------------------------------------------------------------------- 
ImportError        Traceback (most recent call last) 

/Users/.../blahblah/.../<ipython console> in <module>() 

ImportError: dynamic module does not define init function (initmyModule) 

मैं इसे क्यों आयात नहीं कर सकता?

+0

आपका कोड थोड़ा विकृत हो रहा है। –

+1

@Ignacio: मैं बस उदाहरणों का पालन करने की कोशिश कर रहा हूं। क्या कोई आसान उदाहरण है जिससे आप मुझे इंगित कर सकते हैं? – highBandWidth

+0

क्या शीर्ष बॉक्स में कोड वास्तव में आपके स्रोत फ़ाइल में आपके प्रतिबिंबित करता है? –

उत्तर

5

आप एक सी ++ संकलक का उपयोग कर रहे के बाद से, फ़ंक्शन नाम mangled हो जाएगा (उदाहरण के लिए, मेरे g++void initmyModule()_Z12initmyModulev में mangles)। इसलिए, पायथन दुभाषिया आपके मॉड्यूल के init फ़ंक्शन नहीं मिलेगा।

आप या तो एक extern "C" निर्देश के साथ एक सादे सी संकलक का उपयोग करें, या सी लिंकेज के लिए मजबूर करने के लिए अपने मॉड्यूल भर की जरूरत है:

#ifdef __cplusplus 
extern "C" { 
#endif 

#include <Python.h> 

/* 
* Function to be called from Python 
*/ 
static PyObject* py_myFunction(PyObject* self, PyObject* args) 
{ 
    char *s = "Hello from C!"; 
    return Py_BuildValue("s", s); 
} 

/* 
* Bind Python function names to our C functions 
*/ 
static PyMethodDef myModule_methods[] = { 
    {"myFunction", py_myFunction, METH_VARARGS}, 
    {NULL, NULL} 
}; 

/* 
* Python calls this to let us initialize our module 
*/ 
void initmyModule() 
{ 
    (void) Py_InitModule("myModule", myModule_methods); 
} 

#ifdef __cplusplus 
} // extern "C" 
#endif 
+2

दस्तावेज में दिए गए 'PyMODINIT_FUNC' मैक्रो आपके लिए इसे संभाल लेंगे। –

+0

@ IgnacioVazquez-Abrams: क्या आप कृपया अपना समाधान कैसे पूरा कर सकते हैं विस्तृत कर सकते हैं? धन्यवाद। – RDK

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

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