2017-08-05 3 views
0

Ma société migre de Python 2.7 vers Python 3.6 et j'essaie d'installer cGPolyEncode. Mais cela ne fonctionne tout simplement pas, j'obtiens l'erreurRetour d'instruction sans valeur Lors de la tentative d'installation de cgpolyEncode dans Python3.6

gpolyencode_py.cpp:187:69: error: ‘Py_InitModule3’ was not declared in this scope 
          "Google Maps Polyline encoding (C extension)"); 
                     ^
    gpolyencode_py.cpp:190:9: error: return-statement with no value, in function returning ‘PyObject* {aka _object*}’ [-fpermissive] 
      return; 
      ^
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1 

Chaque fois. Certains googling rapides semblent indiquer que le module lui-même doit être réécrit, ce que je ne suis pas qualifié pour faire. J'ai déjà essayé les bases de l'installation python3.6-devlibxml2-dev etc, mais le problème persiste. Y at-il une solution de contournement ou un moyen d'installer cela sans le reconstruire?

Répondre

0

Les extensions C sont tout à fait différent entre python2 et python3. Vous pouvez cependant écrire un fichier qui satisfait à la fois en utilisant le préprocesseur. Voici un croquis d'un module C très basique from my github:

#include <Python.h> 

static PyObject* _hello_world(PyObject* self) { 
    return PyUnicode_FromString("hello world"); 
} 

static struct PyMethodDef methods[] = { 
    {"hello_world", (PyCFunction)_hello_world, METH_NOARGS}, 
    {NULL, NULL} 
}; 

#if PY_MAJOR_VERSION >= 3 
static struct PyModuleDef module = { 
    PyModuleDef_HEAD_INIT, 
    "basic_c_module", 
    NULL, 
    -1, 
    methods 
}; 

PyMODINIT_FUNC PyInit_basic_c_module(void) { 
    return PyModule_Create(&module); 
} 
#else 
PyMODINIT_FUNC initbasic_c_module(void) { 
    Py_InitModule3("basic_c_module", methods, NULL); 
} 
#endif 

Notez que la quelle branche #else est probablement apparenté au module en cours a, vous aurez besoin de le mettre à jour pour ressembler davantage à la branche #if PY_MAJOR_VERSION >= 3