programing

가져오기 오류: 동적 모듈이 init 함수를 정의하지 않습니다(initfizzbuzz).

oldcodes 2023. 7. 8. 11:08
반응형

가져오기 오류: 동적 모듈이 init 함수를 정의하지 않습니다(initfizzbuzz).

나는 컴파일을 시도했습니다.fizzbuzz.c파이썬으로 가져오기 위해.건축용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],
)

모듈 이름이 컴파일된 .so 파일 이름과 다른 경우 boost::python을 사용할 때도 오류가 발생합니다.예:

안녕하세요.cpp

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
using namespace std;
using namespace boost::python;

int helloWorld(){
    cout << "Hello world!" << endl;
    return 0;
}

BOOST_PYTHON_MODULE(libhello) {
    def("hello_world", helloWorld);
}

컴파일 명령:

g++ -fpic -shared -o libfoo.so -Wl,-soname,"libfoo.so" hello.cpp -I<path/to/python> -L/usr/local/lib  -lboost_python-py34

파이썬에 포함할 때import libfoo다음 오류가 발생합니다.

ImportError: dynamic module does not define init function (PyInit_libfoo)

이는 "libhello"와 "libfoo"가 일치하지 않기 때문입니다.

알림 값 - 라이브러리가 다른 python 버전에 대해 컴파일된 경우에도 동일한 오류가 발생할 수 있습니다.예를 들어 공유 개체가 python 3용이지만 python 2에서 모듈을 가져오려고 하는 경우입니다.

Python은 임의의 C 파일을 모듈로 지원하지 않으며 지원할 수 없습니다.모듈이 지원하는 기능을 Python에 알리려면 특정 규칙을 따라야 합니다.

이를 위해 Python은 다음을 찾을 것입니다.init<name>함수, 위치<name>는 모듈 이름입니다.Python이 찾고 있던 것은initfizzbuzz찾을 수 없어서 모듈을 로드하지 못했습니다.

이니셜라이저 외에도 어떤 함수를 사용할 수 있는지 자세히 설명하는 구조를 제공해야 하며, 함수는 Python 유형을 인수로 처리해야 합니다.Python은 필요한 유틸리티 기능을 제공하고 충분히 쉽게 정의합니다.

파이썬 인터프리터 확장 및 임베딩 튜토리얼을 따를 것을 강력히 권장합니다.그것은 당신에게 당신이 알아야 할 모든 것을 가르쳐줍니다.fizzbuzzC 코드는 파이썬 모듈로 작동합니다.

python3./당신의 pythonscript를 합니다.

대신에

파이썬 ./당신의 파이썬 스크립트

파이썬3로 별칭이 지정된 파이썬이 있더라도

이름은 boost 및 boost-python을 컴파일하는 데 정확해야 합니다. boost 재설치 boost --with-python3 --with-python3 --with-python

다음과 같은 함수를 정의해야 합니다.init_fizzbuzz모듈을 초기화하기 위한 코드를 포함해야 합니다.이 함수는 또한 호출해야 합니다.Py_InitModulePython에서 c 함수에 대한 바인딩을 설정합니다.자세한 내용은 튜토리얼을 참조하십시오.

어떤 경우든 코드는 다음과 같은 방식으로 조정되어야 합니다.

static PyObject* py_fizzbuzz(PyObject* self, PyObject* args)
{
    int value;
    if (!PyArg_ParseTuple(args, "i", &value))
        return NULL;
    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);
            }
        }

    // Return value.
    return Py_BuildValue("i", 0);

}

// Mapping between python and c function names. 
static PyMethodDef fizzbuzzModule_methods[] = {
    {"fizzbuzz", py_fizzbuzz, METH_VARARGS},
    {NULL, NULL}
    };

// Module initialisation routine.
void init_fizzbuzz(void)
{
    // Init module.
    (void) Py_InitModule("fizzbuzz", fizzbuzzModule_methods);

}

만약 당신이 파이썬 3을 사용한다면 당신의 코드에 다음과 같은 변경이 필요합니다.

static struct PyModuleDef fizzbuzzModuleDef =
{
    PyModuleDef_HEAD_INIT,
    "fizzbuzz", /* name of module */
    "",          /* module documentation, may be NULL */
    -1,          /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
    fizzbuzzModule_methods
};

PyMODINIT_FUNC PyInit_exmod(void) {
    return PyModule_Create(&fizzbuzzModuleDef);
}

언급URL : https://stackoverflow.com/questions/24226001/importerror-dynamic-module-does-not-define-init-function-initfizzbuzz

반응형