2010-12-04 9 views
0

J'essaye de mettre à niveau un petit module C pour travailler avec Python 3.x et avoir du mal à le compiler. Mon barrage routier en ce moment est que le préprocesseur définit que je suis supposé utiliser pour vérifier que la version de Python ne fonctionne pas.PY_MAJOR_VERSION indéfini lors de la compilation du module Python C pour Python 3.x

Le module contient deux fichiers .c pour le moment (j'ai temporairement mis en commentaire le reste). Dans les deux fichiers, PY_MAJOR_VERSION n'est pas défini, donc le compilateur ne peut pas utiliser les définitions spécifiques de Python 3.x si nécessaire.

mymodule.c:

#ifndef PY_MAJOR_VERSION 
#error Major version not defined! 
#endif 

#if PY_MAJOR_VERSION >= 3 
#define PY3K 
#endif 

#include "Python.h" 
#include "myobj.h" 

/* omitted: irrelevant boilerplate structs */ 

PyMODINIT_FUNC 
initmymodule(void) 
{ 
    PyObject* m; 

#ifdef PY3K 
    m = PyModule_Create(&mymodule_struct); 
#else 
    (void) Py_InitModule("mymodule", MyModMethods); 
    m = Py_InitModule3("mymodule", NULL, 
       "My Module"); 
#endif 

    /* omitted: the rest of the module init code */ 
} 

myobj.c:

#ifndef PY_MAJOR_VERSION 
#error Major version not defined! 
#endif 

#if PY_MAJOR_VERSION >= 3 
#define PY3K 
#endif 

#include "Python.h" 
#define NEED_STATIC 
#include "myobj.h" 
#undef NEED_STATIC 

#ifdef PY3K 
#define PYSTR_FROMC PyUnicode_FromString 
#define PYSTR_FORMAT PyUnicode_Format 
#define PYINT_FROMC PyLong_FromLong 
#else 
#define PYSTR_FROMC PyString_FromString 
#define PYSTR_FORMAT PyString_Format 
#define PYINT_FROMC PyInt_FromLong 
#endif 

/* omitted: rest of module code */ 

setup.py:

from distutils.core import setup, Extension 

module1 = Extension('mymodule', sources = ['mymodule.c', 'myobj.c']) 
setup(name='mymodule', version='0.1', ext_modules=[module1]) 

Je construis avec c:\python31\python setup.py bdist_wininst

Où est PY_MAJOR_VERSION su mis en place pour se définir? Est-ce quelque chose que j'ai besoin de dire à distutils de passer au compilateur?

Répondre

4

J'ai compris ce que je faisais de mal. C'est Python.h qui définit PY_MAJOR_VERSION. En mettant mes #defines devant mes #includes, j'ai raté la définition. Je ne sais pas pourquoi je pensais que le système de construction le définirait pour moi ...

Déplacer le #if PY_MAJOR_VERSION> = 3 afin qu'il s'exécute après #include "Python.h" résout le problème. Je vais laisser ceci ici au cas où quelqu'un d'autre serait aussi bête que moi, car il n'y avait rien d'utile sur Google pour cette requête.

+0

Je vais juste dire ça. Définir le test pourrait être très facile si vous utilisez un IDE comme VS2010. – Kabie

+0

Vous devez sélectionner votre propre réponse en tant que réponse, de sorte que la question soit marquée comme réponse. –

+0

Fait, merci. J'apprends encore un peu mon chemin autour de cet endroit. :) – cecilkorik

Questions connexes