动态模块没有定义init函数(PyInit_fuzzy)

时间:2015-04-15 17:51:54

标签: python cython

我正在使用Python3.4,我正在尝试安装模糊模块

https://pypi.python.org/pypi/Fuzzy. 

因为它被提到它只适用于Python2,我试图使用cython转换它。这些是我遵循的步骤:

  1. cython fuzzy.pyx
  2. gcc -g -02 -fpic python-config --cflags -c fuzzy.c -o fuzzy.o
  3. 为double_metaphone.c做了同样的事。
  4. gcc -shared -o fuzzy.so fuzzy.o double_metaphone.o python-config --libs
  5. 当我尝试导入模糊时出现错误:

    dynamic module does not define init function (PyInit_fuzzy)
    

    问题是什么?这是因为python2和python3的冲突吗?如何解决这个问题?

1 个答案:

答案 0 :(得分:13)

这是通过快速评论解决的,但是为了给出更多细节而作为答案发布...

非常简短的回答是替换python-configpython3-config的{​​{1}}的所有实例。

不必要的细节如下

OP试图在Python 3中使用Pyrex模块(这个问题并不是特别清楚),因此在Cython中重建它是一种明智的方法,因为Cython最初是基于Pyrex。 / p>

Cython生成的代码应该编译为在Python 2或3中工作,具体取决于包含的头。 python3.4-config为系统上的默认Python版本生成相关的编译器/链接器选项,在编写本文时,它通常是Python 2(在我的系统上它包括python-config)。因此,它为Python 2构建模块。使用-I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7确保包含正确的版本。

在从Python 2到Python 3的转换中,导入C模块时调用的函数已从python3.4-config更改为init<modulename>,可能有助于确保您只能导入为正确版本构建的模块。因此,当使用Python 2构建模块时,它只会创建PyInit_<modulename>,因此无法在导入时找到initfuzzy