2010-11-06 11 views
7

tanımlamıyor. Tüm kodu yazdıktan ve derledikten sonra, Python modülü içe aktaramaz. here verilen örneği takip ediyorum. Bazı yazım hatalarını düzelttikten sonra burada yeniden yapıyorum. Bir dosya myModule.c vardır: Bir Mac MacPorts ile piton üzerinde olduğum.bu modülü doesnt ithalat: Dinamik modül Bir C fonksiyonu için bir piton sarmalayıcı yazmaya çalışıyorum başlat işlevini

#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); 
} 

, ben bunu almaya çalıştığınızda bir hata alıyorum, ancak

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

olarak derlemek.

$ 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) 

Neden onu alabilirim?

+0

Kodunuz biraz bozuk gibi görünüyor. –

+1

@Ignacio: Sadece örnekleri takip etmeye çalışıyorum. Beni işaret edebileceğin daha basit bir örnek var mı? – highBandWidth

+0

Üst kutudaki kod, kaynak dosyanızda sahip olduğunuz şeyi gerçekten yansıtıyor mu? –

cevap

5

bir C++ derleyicisi kullandığınız için, fonksiyon isimleri mangled olacaktır (örneğin, benim g++_Z12initmyModulev içine void initmyModule() mangles). Bu nedenle, python yorumlayıcısı modülün başlangıç ​​işlevini bulamaz.

Bir extern "C" yönergesi ile modül boyunca düz bir C derleyicisi kullanabilir veya C bağını uygulatmaya ya gerekir:

#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

Belgedeki "PyMODINIT_FUNC" makrosu bunu sizin için halledecektir. IgnacioVazquez-Abrams @ –

+0

: Eğer çözüm yürütmek için nasıl lütfen açar mısın? Teşekkürler. – RDK

İlgili konular