2017-04-25 5 views
1

난 그냥 C에서 첫 파이썬 확장 모듈을 작성하기위한 시도를 시작하고 있고 https://www.tutorialspoint.com/python/python_further_extensions.htmC++ 파이썬 모듈 가져 오기 오류 : "정의되지 않은 심볼 : Py_InitModule3"(Py_InitModule는())

에 제공된 지침 내가 리눅스 오전를 사용하는 민트 18.1, virtualenv 버전에서 파이썬 3.6.1 사용.

첫 번째 단계에서는 필자가 작성하고자하는 Python 모듈의 매우 단순한 버전을 컴파일했습니다. 여기

include <Python.h> 

static PyObject* uniqueCombinations(PyObject* self) 
{ 
    return Py_BuildValue("s", "uniqueCombinations() return value (is of type 'string')"); 
} 

static char uniqueCombinations_docs[] = 
    "usage: uniqueCombinations(lstSortableItems, comboSize)\n"; 

static PyMethodDef uniqueCombinations_funcs[] = { 
    {"uniqueCombinations", (PyCFunction)uniqueCombinations, 
    METH_NOARGS, uniqueCombinations_docs}, 
    {NULL} 
}; 

void inituniqueCombinations(void) 
{ 
    Py_InitModule3("uniqueCombinations", uniqueCombinations_funcs, 
        "Extension module uniqueCombinations v. 0.01"); 
} 

uniqueCombinations.cpython-36m-x86_64-linux-gnu.so에 나는 C 코드를 컴파일하는 데 사용했던 setup.py 파일의 코드 : 여기

내 C 코드 놀랍게도

from distutils.core import setup, Extension 

setup(name='uniqueCombinations', version='0.01', \ 
     ext_modules=[Extension('uniqueCombinations', ['uniqueCombinations_pythonCmodule_v-0.01_Cg.c'])]) 

>>> import uniqueCombinations 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: uniqueCombinations.cpython-36m-x86_64-linux-gnu.so: undefined symbol: Py_InitModule3 

Why am I getting this error?

And what should I do to be able to load the compiled module properly?

: 모듈 가져 오기에 제대로로드되지 않습니다 여기

Py_InitModule3의 암시 적 선언에 대한 경고와 빌드 프로토콜 다음 Py_InitModule (Py_InitModule3가) 더 이상

$ python uniqueCombinations_pythonCmodule_v-0.01_setup.py_Cg.py build 
running build 
running build_ext 
building 'uniqueCombinations' extension 
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/include/python3.6m -c uniqueCombinations_pythonCmodule_v-0.01_Cg.c -o build/temp.linux-x86_64-3.6/uniqueCombinations_pythonCmodule_v-0.01_Cg.o 
uniqueCombinations_pythonCmodule_v-0.01_Cg.c: In function ‘inituniqueCombinations’: 
uniqueCombinations_pythonCmodule_v-0.01_Cg.c:19:5: warning: implicit declaration of function ‘Py_InitModule3’ [-Wimplicit-function-declaration] 
    Py_InitModule3("uniqueCombinations", uniqueCombinations_funcs, 
    ^
creating build/lib.linux-x86_64-3.6 
gcc -pthread -shared build/temp.linux-x86_64-3.6/uniqueCombinations_pythonCmodule_v-0.01_Cg.o -o build/lib.linux-x86_64-3.6/uniqueCombinations.cpython-36m-x86_64-linux-gnu.so 
+0

이 댓글의 현재 : 868 번, 투표 없음. 이런 젠장? – Scott

답변

2

을 사용한다. 대신 PyModuleDef 구조체를 생성 한 다음 PyModule_Create에 참조를 전달해야합니다. 가져올 때 오류가 발생하지 않는 모듈을 생성에서 C 코드 아래

:

여기
#include <Python.h> 

static PyObject* uniqueCombinations(PyObject* self) 
{ 
    return Py_BuildValue("s", "uniqueCombinations() return value (is of type 'string')"); 
} 

static char uniqueCombinations_docs[] = 
    "usage: uniqueCombinations(lstSortableItems, comboSize)\n"; 

/* deprecated: 
static PyMethodDef uniqueCombinations_funcs[] = { 
    {"uniqueCombinations", (PyCFunction)uniqueCombinations, 
    METH_NOARGS, uniqueCombinations_docs}, 
    {NULL} 
}; 
use instead of the above: */ 

static PyMethodDef module_methods[] = { 
    {"uniqueCombinations", (PyCFunction) uniqueCombinations, 
    METH_NOARGS, uniqueCombinations_docs}, 
    {NULL} 
}; 


/* deprecated : 
PyMODINIT_FUNC init_uniqueCombinations(void) 
{ 
    Py_InitModule3("uniqueCombinations", uniqueCombinations_funcs, 
        "Extension module uniqueCombinations v. 0.01"); 
} 
*/ 

static struct PyModuleDef Combinations = 
{ 
    PyModuleDef_HEAD_INIT, 
    "Combinations", /* name of module */ 
    "usage: Combinations.uniqueCombinations(lstSortableItems, comboSize)\n", /* module documentation, may be NULL */ 
    -1, /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */ 
    module_methods 
}; 

PyMODINIT_FUNC PyInit_Combinations(void) 
{ 
    return PyModule_Create(&Combinations); 
} 

빌드 프로토콜 :

$ python uniqueCombinations_pythonCmodule_v-0.01_setup.py_Cg.py build 
running build 
running build_ext 
building 'Combinations' extension 
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/include/python3.6m -c uniqueCombinations_pythonCmodule_v-0.01_Cg.c -o build/temp.linux-x86_64-3.6/uniqueCombinations_pythonCmodule_v-0.01_Cg.o 
gcc -pthread -shared build/temp.linux-x86_64-3.6/uniqueCombinations_pythonCmodule_v-0.01_Cg.o -o build/lib.linux-x86_64-3.6/Combinations.cpython-36m-x86_64-linux-gnu.so 

성공적인 수입과 대화 형 파이썬 콘솔 세션 :

>>> import Combinations 
>>> dir(Combinations) 
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'uniqueCombinations'] 
>>> Combinations.__doc__ 
'usage: Combinations.uniqueCombinations(lstSortableItems, comboSize)\n' 
>>> Combinations.uniqueCombinations() 
"uniqueCombinations() return value (is of type 'string')" 
>>>