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

ImportError:动态模块未定义初始化函数(initfizzbuzz)

慕麒
2023-03-14
问题内容

我尝试编译fizzbuzz.c,以便通过python导入它。对于建筑fizzbuzz.c,我用过python setup.py build_ext -i

构建它之后,我尝试导入,fizzbuzz.c但是发生以下错误。我怎么解决这个问题 ?

错误

>>> import fizzbuzz
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initfizzbuzz)

fizzbuzz.c

#include <stdio.h>

void fizzbuzz(int n){

    for (int i=1; i <= n; i++){
        if (i % 3 == 0 && i % 5 ==0){
            printf("fizzbuzz %d \n", i);
        }
        else if (i % 3 == 0){
            printf("fizz %d \n", i);
        }
        else if(i % 5 == 0){
            printf("buzz %d \n", i);
        }
    }
}

setup.py

from distutils.core import setup, Extension
module = Extension('fizzbuzz', ['fizzbuzz.c'])
setup(
      name='fizzbuzz',
      version='1.0',
      ext_modules=[module],
)

问题答案:

Python不支持,也不支持将任意C文件作为模块。您必须遵循某些约定才能让Python知道您的模块支持哪些功能。

为此,Python将寻找一个init<name>函数,<name>模块名称在哪里。Python正在寻找initfizzbuzz但未能找到它,因此加载模块失败。

除了初始化程序外,您还需要提供一个结构,详细说明可用的函数,并且您的函数将需要将Python类型作为参数进行处理。Python为您提供了必要的实用程序功能,并对其进行了定义以使其变得足够容易。

我强烈建议您遵循“扩展和嵌入Python解释器”教程。它教您使fizzbuzzC代码作为Python模块工作所需的一切知识。



 类似资料:
  • 问题内容: 我正在使用Python3.4,并且尝试安装Fuzzy模块 由于提到了它仅适用于Python2,因此我尝试使用cython对其进行转换。这些是我遵循的步骤: cython Fuzzy.pyx gcc -g -02 -fpic -c Fuzzy.c -o Fuzzy.o 对double_metaphone.c做相同的操作 gcc -shared -o Fuzzy.so Fuzzy.o do

  • 我正在使用这个库,对于它的一个类(从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__() 的括号中