CPython:动态模块没有定义模块导出函数

2024-03-29 12:44:59 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我刚刚编译了C++类的Python包装器。但是,当我尝试将我的模块加载到Python时(通过import cell)收到以下消息:

ImportError: dynamic module does not define module export function (PyInit_cell)

我检查了系统是否在所有情况下都使用Python3,因此这不是Python版本问题。
以下是我的设置.py文件:

^{pr2}$

下面是生成的.so文件的转储:

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中,因为在构建过程中没有出现错误。在

任何帮助都将不胜感激!在


Tags: 模块文件cellarrayglobaldostartend
1条回答
网友
1楼 · 发布于 2024-03-29 12:44:59

您不应该调用您的扩展/模块cell.pyx,而是以不同的方式调用它—例如cycell.pyx。在

为什么?在构建扩展时,将执行以下步骤

  1. Cython从cell.pyx生成文件cell.cpp。在
  2. 编译器将cell.cpp编译为目标文件cell.o。在
  3. 编译器将cell.cc编译为目标文件cell.o,并覆盖从cell.pyx创建的目标文件。在
  4. 链接器链接两个cell.o文件(但实际上只有一个)cell.pyx/cell.cpp中定义的内容不存在。在

通过重命名Cython文件,可以避免对象文件被覆盖。在

显然,另一个选择是重命名c++文件。在

相关问题 更多 >