我刚刚成功编译了 C++ 类的 Python 包装器。但是,当我尝试将模块加载到 Python 时(通过import cell
):
ImportError: dynamic module does not define module export function (PyInit_cell)
我检查了系统在所有情况下都使用 Python3,因此这不是 Python 版本问题。
下面是我的setup.py file:
from distutils.core import setup, Extension
from Cython.Build import cythonize
setup(ext_modules = cythonize(Extension(
"cell",
sources=["cell.pyx", "cell.cc"],
language="c++",
extra_compile_args=["-std=c++11"],
)))
下面是生成的转储.so file:
0000000000201020 B __bss_start
0000000000201020 b completed.7594
w __cxa_finalize@@GLIBC_2.2.5
0000000000000530 t deregister_tm_clones
00000000000005c0 t __do_global_dtors_aux
0000000000200de8 t __do_global_dtors_aux_fini_array_entry
0000000000201018 d __dso_handle
0000000000200df8 d _DYNAMIC
0000000000201020 D _edata
0000000000201028 B _end
0000000000000630 T _fini
0000000000000600 t frame_dummy
0000000000200de0 t __frame_dummy_init_array_entry
0000000000000640 r __FRAME_END__
0000000000201000 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
00000000000004e8 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
0000000000200df0 d __JCR_END__
0000000000200df0 d __JCR_LIST__
w _Jv_RegisterClasses
0000000000000570 t register_tm_clones
0000000000201020 d __TMC_END__
我真的不明白为什么模块没有加载到python中,因为在构建过程中没有错误。
任何帮助,将不胜感激!
你不应该调用你的扩展/模块cell.pyx
,以不同的方式称呼它 - 例如cycell.pyx
.
为什么?构建扩展时执行以下步骤
- Cython 生成文件
cell.cpp
out of cell.pyx
.
- 编译器编译
cell.cpp
到目标文件cell.o
.
- 编译器编译
cell.cc
到目标文件cell.o
并覆盖从中创建的目标文件cell.pyx
.
- 链接器链接两者
cell.o
文件(但实际上只有一个) - 结果中没有任何内容定义cell.pyx
/cell.cpp
尤其PyInit_cell
.
通过重命名 Cython 文件,可以避免目标文件被覆盖。
显然,另一个选择是重命名您的 c++ 文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)