无法解决“ImportError: dynamic module does not define module export function”

新手上路,请多包涵

这是我正在尝试编译和安装的 python 包 的链接。我已经尝试了几个小时可以在网上找到的内容,但无法克服 ImportError

包装内容如下。

在此处输入图像描述

它的 setup.py 具有以下内容。这里有两个模块。一个是带有 sparse_learning 的 python 包装器包,另一个是名为 proj_module 的 ac 扩展模块。

在此处输入图像描述

我按照这里描述的过程 https://docs.python.org/3.6/extending/building.html 在 Ubuntu 18.04 上编译和安装。 没有错误信息

sudo python3 setup.py build_ext –inplace 在此处输入图像描述

sudo python3 setup.py 安装

然后,当我尝试加载 C 扩展模块 proj_module 时,出现错误“ImportError: dynamic module does not define module export function”。

python3 -c“导入proj_module”

在此处输入图像描述

我尝试应用在线找到的解决方案,包括使用 sudo apt purge python2.7-minimal 卸载 Python2,或将 python3 站点包路径添加到 bashrc。但是,它们都不起作用。 在此处输入图像描述


我只知道它最初是为 Python 2 编写的。然后在 main_wrapper.c 中进行了两次修改以使其为 Python 3 运行。它们对我来说是正确的……

添加: 在此处输入图像描述

改变了: 在此处输入图像描述

原文由 Tony 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.3k
2 个回答

看起来您在此处的 Python 3 模块中混合了一些 Python 2 风格的代码。你只需要更换

PyMODINIT_FUNC initproj_module() {

PyMODINIT_FUNC PyInit_proj_module() {

在你的 main_wrapper.c 文件中。

原文由 Nathan Vērzemnieks 发布,翻译遵循 CC BY-SA 4.0 许可协议

当您使用 Cython 和 CMake 等构建系统时,也会发生此错误。在 PyInit_<modname> 中, modname 应该匹配文件名。例如,您可能要求 Cython 创建 extension 目标,但 CMake 可能会从中生成 libextension.so 。然后当您在 Python 中导入 libextension 时,它将查找 PyInit_libextension 但 Cython 将生成 PyInit_extension

原文由 Robin De Schepper 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题