PY_MAJOR_VERSION не определено при компиляции модуля Python C для Python 3.x - PullRequest
0 голосов
/ 04 декабря 2010

Я пытаюсь обновить небольшой модуль C для работы с Python 3.x и не могу его скомпилировать. Мой контрольно-пропускной пункт сейчас заключается в том, что препроцессор определяет, что я должен использовать, чтобы проверить, что версия Python не работает.

В данный момент модуль содержит два файла .c (остальные я временно закомментировал). В обоих файлах PY_MAJOR_VERSION не определено, поэтому компилятор не может использовать определенные определения Python 3.x, где это необходимо.

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

Я строю с c:\python31\python setup.py bdist_wininst

Где должна быть определена PY_MAJOR_VERSION? Это то, что мне нужно сказать distutils для передачи компилятору?

1 Ответ

4 голосов
/ 04 декабря 2010

Я понял, что я делаю неправильно. Это Python.h, который определяет PY_MAJOR_VERSION. Поставив мои #defines перед своими #include, я упустил определение. Я не знаю, почему я думал, что система сборки определит это для меня ...

Перемещение #if PY_MAJOR_VERSION> = 3 так, чтобы оно выполнялось после того, как #include «Python.h» решает проблему Я оставлю это здесь на тот случай, если кто-то еще такой же глупый, как я, потому что в Google нет ничего полезного для этого запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...