2016-03-30 5 views
2

Попытки получить Cython бежать, и я получаю этот вопрос после того, как после быстрого старта руководства:Cython построить питон скрипт

$ ~/midt $ ./setup.py build_ext --inplace 
running build_ext 
building 'proc' extension 
x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c proc.c -o build/temp.linux-x86_64-2.7/proc.o 
proc.c:2511:16: error: ‘initproc’ redeclared as different kind of symbol 
PyMODINIT_FUNC initproc(void); /*proto*/ 
       ^
In file included from /usr/include/python2.7/Python.h:80:0, 
       from proc.c:16: 
/usr/include/python2.7/object.h:320:15: note: previous declaration of ‘initproc’ was here 
typedef int (*initproc)(PyObject *, PyObject *, PyObject *); 
      ^
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1 

Вот мои номера версии и прочее:

$ ~/midt $ python --version 
Python 2.7.6 
$ ~/midt $ cython --version 
Cython version 0.23.5 
$ ~/midt $ uname -a 
Linux xxxxx 3.13.0-37-generiC#64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux 

ответ

2

I считают, что проблема заключается в следующем:

  1. Python требует, чтобы функция инициализировала инициализацию модуля C, которая должна называться init<module_name> (где вы заменяете свое имя модуля). (Python 3 использует немного другую форму).

  2. Вы вызвали свой модуль proc.

  3. Таким образом, Cython создал функцию, называемую initproc, которая будет определена при импортировании вашего модуля.

  4. Python определяет typedef под названием initproc внутренне, что конфликтует с созданным Cython initproc, используемым для инициализации вашего модуля.

Решение заключается в вызове вашего модуля чем-то иным, чем proc. Это не идеальное решение, но не так много других вариантов.


Одна из причин Python 3 выбрал другую форму PyInit_<module_name> было то, что форма Python 2, как известно, вызывает несколько конфликтов (см https://www.python.org/dev/peps/pep-3121/#entry-point-name-conflicts).

Смежные вопросы