C++ Python 模块导入错误: "undefined symbol: Py_InitModule3" ( Py_InitModule () )
C++ Python module import error: "undefined symbol: Py_InitModule3" ( Py_InitModule () )
我刚刚开始尝试编写我的第一个python扩展模块,并使用https://www.tutorialspoint.com/python/python/python_further_extensions.htmtm>
我在Linux Mint 18.1上使用Python 3.6.1在其Virtualenv版本中。
作为第一步,我已经编译了我计划编写的Python模块的非常简约的版本。
在这里我的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";
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");
}
以及我用来将C代码编译为uniqueCombinations.cpython-36m-x86_64-linux-gnu.so
的setup.py文件的代码:
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
为什么我会遇到此错误?
我该怎么做才能正确加载编译的模块?
在这里,构建协议带有有关py_initmodule的隐式声明的警告3:
$ 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
不再使用py_initmodule(py_initmodule3(。有必要创建一个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
和成功导入的交互式Python控制台会话:
>>> 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')"
>>>
相关文章:
- 相当于 pybind11 中的 boost::p ython py::scope().attr()
- 如何构建一个 setup.py 来编译C++使用 Python、pybind11 和 Mingw-w64 的扩展?
- 如何应用 printers.py 修改?(Linux操作系统)
- 通过 sh 导入模块错误运行.py脚本
- 链接 library.lib 使用 setup.py.
- pybind 如何对 py::list 对象进行操作
- 返回多个 py::数组而不在 pybind11 中复制
- 如何在 module.reload() 之后保持 py::objects 存活
- pybind11:属性错误:尝试从 py 文件运行函数时,模块'XXX'没有属性'YYY'
- 通往GCC_ARM之路 (mbed_settings.py)
- 如何从 python (py) 文件调用 C++ 函数
- 使用参数调用C 的gdal_merge.py
- 如何在python文件中访问c ++头文件(.py)
- 当我使用py 生成时,然后在macOS上boost.python包装器时,我会发现有关std :: string的错
- 在同一目录中使用conanfile.txt和conanfile.py
- 从C 运行.py脚本
- 扩展安装工具扩展以在 setup.py 中使用 CMake
- 提升 Python 如何在导入的 Python 文件中导入 py
- cocos2dx重置或更改setup.py中Android的环境变量
- SublimeLinter(ST3/ST2) for C++ (cppcheck/cppint.py)