当前位置: 首页 > 面试题库 >

动态模块未定义初始化函数(PyInit_fuzzy)

司马晋
2023-03-14
问题内容

我正在使用Python3.4,并且尝试安装Fuzzy模块

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

当我尝试导入模糊时,出现错误:

dynamic module does not define init function (PyInit_fuzzy)

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


问题答案:

这是通过快速评论解决的,但为了给出更多详细信息而发布为答案…

非常简短的答案是替换python-configforpython3-config或的所有实例python3.4-config

不必要的细节如下

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

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

在从Python 2到Python
3的转换中,导入C模块时调用的函数从更改init<modulename>PyInit_<modulename>,大概是为了确保您只能导入为正确版本构建的模块。因此,当使用Python
2构建模块时,它仅创建initfuzzy,因此PyInit_fuzzy在导入时找不到。



 类似资料:
  • 问题内容: 我尝试编译,以便通过python导入它。对于建筑,我用过。 构建它之后,我尝试导入,但是发生以下错误。我怎么解决这个问题 ? 错误 fizzbuzz.c setup.py 问题答案: Python不支持,也不支持将任意C文件作为模块。您必须遵循某些约定才能让Python知道您的模块支持哪些功能。 为此,Python将寻找一个函数,模块名称在哪里。Python正在寻找但未能找到它,因此加

  • 我正在使用这个库,对于它的一个类(从ViewGroup扩展而来),在“PLA\u AbsListView.java”中,在CTOR中,有以下几行代码: 最近,我更新了SDK 自从我更新了所有内容后,我一直收到这个错误: PLA\u AbsListView类型的方法initializeScrollbars(TypedArray)未定义 我尝试将API设置为低于21,但没有帮助。 我还试图找出这个函数

  • 问题内容: 这是一段Java代码: 它如何编译?初始化后已执行变量“ ture”的声明。据我所知,静态块和字段已经按照它们出现的顺序执行了。 现在,为什么实例块中的值9已被打印3次?顺便说一句,该类的实例已创建了3次。那不是功课,我正在学习Java进行认证。 问题答案: 关于第一个问题,静态块确实按照它们出现的顺序进行处理,但是在处理静态块之前,先处理声明。声明作为类 准备工作 的一部分(JLS§

  • 问题内容: 在Java中,但是在其他OO语言中,初始化属性定义之间也有区别,例如 并使用构造函数对其进行初始化? 我想不出任何实际的区别,有没有?否则,即使结果相同,是否存在一种方法优于另一种方法的情况? 问题答案: 初始化顺序在这里很重要。 将字段设置为默认初始值(0,false,null) 调用对象的构造函数(但不要执行构造函数的主体) 调用超类的构造函数 使用初始化程序和初始化块初始化字段

  • 问题内容: 据我了解,“静态初始化块”用于设置静态字段的值(如果无法在一行中完成的话)。 但是我不明白为什么我们需要为此设置一个特殊的块。例如,我们将字段声明为静态(无值分配)。然后编写几行代码,生成并为上面声明的静态字段分配一个值。 为什么我们需要在这样一个特殊的块这样的行:? 问题答案: 在非静态块: 每次构造类的实例时被调用。在静态块只被调用一次,当类本身初始化,无论该类型的有多少对象创建。

  • 1、什么是初始化函数 初始化函数的意思是,当你创建一个实例的时候,这个函数就会被调用。 比如: 当代码在执行 a = ClassA() 的语句时,就自动调用了 __init__(self) 函数。 而这个 __init__(self) 函数就是初始化函数,也叫构造函数。 初始化函数的写法是固定的格式:中间是 init,意思是初始化,然后前后都要有【两个下划线】,然后 __init__() 的括号中