가져오기 오류: 동적 모듈이 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은 필요한 유틸리티 기능을 제공하고 충분히 쉽게 정의합니다.
파이썬 인터프리터 확장 및 임베딩 튜토리얼을 따를 것을 강력히 권장합니다.그것은 당신에게 당신이 알아야 할 모든 것을 가르쳐줍니다.fizzbuzz
C 코드는 파이썬 모듈로 작동합니다.
python3./당신의 pythonscript를 합니다.
대신에
파이썬 ./당신의 파이썬 스크립트
파이썬3로 별칭이 지정된 파이썬이 있더라도
이름은 boost 및 boost-python을 컴파일하는 데 정확해야 합니다. boost 재설치 boost --with-python3 --with-python3 --with-python
다음과 같은 함수를 정의해야 합니다.init_fizzbuzz
모듈을 초기화하기 위한 코드를 포함해야 합니다.이 함수는 또한 호출해야 합니다.Py_InitModule
Python에서 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
'programing' 카테고리의 다른 글
ASP.NET ID 재설정 암호 (0) | 2023.07.08 |
---|---|
Firebase Analytics 사용자 지정 이벤트 매개 변수 (0) | 2023.07.08 |
장치에서 Firebase 클라우드 메시징 알림을 수신하지 않음 (0) | 2023.07.08 |
두 날짜의 시간이 아닌 날짜 부분만 비교하는 방법은 무엇입니까? (0) | 2023.07.03 |
MongoDB: 치명적 오류: 'MongoClient' 클래스를 찾을 수 없습니다. (0) | 2023.07.03 |