.donc module n'importe pas en python: le module dynamique ne définit pas la fonction d'initialisation

StackOverflow https://stackoverflow.com/questions/4112375

Question

Je suis en train d'écrire un wrapper python pour une fonction C. Après avoir écrit tout le code, et de le faire pour compiler, Python ne peut pas importer le module. Je suivais l'exemple . Je reproduis ici, après la fixation des fautes de frappe. Il y a un fichier myModule.c:

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

Depuis que je suis sur un Mac avec python Macports, je compile comme

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

Cependant, je reçois une erreur lorsque je tente d'importer.

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

Pourquoi ne puis-je importer?

Était-ce utile?

La solution

Puisque vous utilisez un compilateur C ++, les noms de fonction sera mutilée (par exemple, mes g++ Mangles void initmyModule() en _Z12initmyModulev). Par conséquent, l'interpréteur python ne trouvera pas la fonction d'initialisation de votre module.

Vous devez soit utiliser un compilateur C ordinaire, ou la force de liaison C tout au long de votre module avec un extern "C" directive :

#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 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top