无法解决“导入错误:动态模块未定义模块导出功能”

Ton*_*ony 8 python python-3.x

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

包装内有以下内容。

在此处输入图片说明

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

在此处输入图片说明

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

须藤 python3 setup.py build_ext --inplace 在此处输入图片说明

须藤 python3 setup.py 安装

然后,当我尝试加载 C 扩展模块时proj_module,会出现错误“ImportError:动态模块未定义模块导出功能”。

python3 -c "导入 proj_module"

在此处输入图片说明

我尝试应用在线找到的解决方案,包括使用 卸载 Python2 sudo apt purge python2.7-minimal,或将 python3 站点包路径添加到 bashrc。然而,他们都没有工作。 在此处输入图片说明


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

添加: 在此处输入图片说明

更改: 在此处输入图片说明

Nat*_*eks 9

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

PyMODINIT_FUNC initproj_module() {

PyMODINIT_FUNC PyInit_proj_module() {

在您的main_wrapper.c文件中。


小智 8

使用时pybind11,此错误可能表明给出的模块名称与PYBIND11_MODULE库的文件名不匹配。

以图书馆为例:

lib_abc.cpython-311-x86_64-linux-gnu.so
Run Code Online (Sandbox Code Playgroud)

应使用以下模块名称生成:

PYBIND11_MODULE(lib_abc, handle)
{
...
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*per 5

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