2016-03-30 15 views
2

を構築するために、私はクイックスタートガイドに従った後、この問題を得る:ここでCythonを実行するcythonを取得しようとするPythonスクリプト

$ ~/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には、0と呼ばれるCモジュールの初期化を初期化する関数が必要です(モジュール名の代わりに) (Python 3ではわずかに異なる形式が使われています)。

  2. モジュールprocを呼び出しました。

  3. したがって、Cythonはモジュールをインポートするときに定義されるinitprocという関数を作成しました。

  4. Pythonは内部でinitprocというtypedefを定義しています。このtypedefは、モジュールを初期化するために使用されるCython生成initprocと競合します。

解決策は、proc以外のモジュールを呼び出すことです。それは理想的な解決策ではありませんが、あまりにも多くのオプションがありません。理由はPython 3の


一つは、PyInit_<module_name>は、Python 2フォームはいくつかの矛盾を引き起こすことが知られたことで、異なるフォームを(https://www.python.org/dev/peps/pep-3121/#entry-point-name-conflicts参照)を選びました。