1. ホーム
  2. python

[解決済み] ImportError: ダイナミックモジュールにinit関数が定義されていない (initfizzbuzz)

2022-02-10 16:26:45

質問

をコンパイルしようとしました。 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 インタープリタの拡張と組み込み チュートリアル . を作成するために必要なすべての知識を教えてくれます。 fizzbuzz C言語のコードがPythonのモジュールとして動作します。