c++ - C++、Python 3.7.4、SWIG 4.0.0 和 Windows 10 的问题 - ModuleNotFoundError

标签 c++ python-3.x windows-10 mingw swig

我正在用 C++ 编写一个库,即将发布。除了该库之外,我还向 Python 3.7.4 添加了一个使用 SWIG 4.0.0 自动生成的接口(interface)。在Ubuntu 18.04中,界面运行完美:可以毫无问题地导入Python3。但在 Windows 10 中,情况并非如此。在用 C++ 生成包装器、对其进行编译并将其链接到已编译的 C++ 库(作为共享对象)后,将其链接到 *.so 文件中,从 python 导入它不起作用。导入后的错误信息类似如下

     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
       File "C:\programming\python_lib\lal.py", line 15, in <module>
         import _lal
     ModuleNotFoundError: No module named '_lal'

我不明白为什么会出现此错误消息。 python 的安装效果很好(我可以导入它的典型包,例如 sys),并且可以使用命令终端执行 python 脚本。我希望你能帮我解决这个问题。

我想补充一点,这也发生在我能想到的最小示例中:

  • 文件fact.hpp
    int my_factorial(int n);
  • 文件fact.cpp
    #include "fact.hpp"
    int my_factorial(int n) {
        if (n == 0) { return 1; }
        return n*my_factorial(n - 1);
    }
  • 文件factorial.i
    %module factorial
    %{
    #include "fact.hpp"
    %}
    %include "fact.hpp"
  • 文件Makefile
    PYTHON_INCLUDE = -IC:/programming/Python37/include
    all: factorial.so 
    factorial.so: fact.o wrap_factorial.o
        g++ -o $@ -shared $<
    wrap_factorial.o: wrap_factorial.cpp
        g++ -o $@ -c $< $(PYTHON_INCLUDE)
    fact.o: fact.cpp fact.hpp
        g++ -c fact.cpp
    wrap_factorial.cpp: factorial.i fact.hpp
        swig -c++ -python -py3 -o wrap_factorial.cpp factorial.i

无论我在哪个目录中启动 python,python 给我的错误消息都是:

     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
       File "C:\Users\Usuari\factorial.py", line 15, in <module>
         import _factorial
     ModuleNotFoundError: No module named '_factorial'

如果你们中的一些人能帮助我解决这个问题,我将非常感激。我之前曾搜索过该网站,但没有成功。

提前感谢大家。


其他可能有用的详细信息:

  • g++:与 MinGW 一起安装
  • Windows 10:64 位。
  • 环境变量是:
    • PYTHONHOME:C:\programming\Python37
    • PYTHONPATH:C:\programming\python_lib;C:\programming\Python37\Lib

最佳答案

感谢@flexo 指出问题。在 Windows 上,我们必须制作 .pyd,而不是 .so。

除了@Flexo 指出的更改之外,还有其他一些事情也必须更改。最小示例的 Makefile 正确版本是:

    PYTHON_INCLUDE  = -IC:\programming\Python37\include
    PYTHON_LIBS_DIR = -LC:\programming\Python37\libs
    all: _factorial.pyd
    _factorial.pyd: fact.o wrap_factorial.o
        g++ -o $@ -shared fact.o wrap_factorial.o $(PYTHON_LIBS_DIR) -lpython3 $(PYTHON_LIBS_DIR) -lpython37
    wrap_factorial.o: wrap_factorial.cpp
        g++ -o $@ -c $< $(PYTHON_INCLUDE)
    fact.o: fact.cpp fact.hpp
        g++ -c fact.cpp
    wrap_factorial.cpp: factorial.i fact.hpp
        swig -c++ -python -py3 -o wrap_factorial.cpp factorial.i

注意更改: - 在模块名称的开头使用下划线(我应该知道的)。 - 针对 python37 和 python3 的链接(第二个完成大部分工作,但两者都是必需的)。

再次感谢@flexo指出了最重要的问题。

关于c++ - C++、Python 3.7.4、SWIG 4.0.0 和 Windows 10 的问题 - ModuleNotFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57961390/

相关文章:

c++ - 如何正确更改ListView控件中的焦点项?

c++ - 为什么可以使用 setprecision fixed 时使用 showpoint?

python - 如何在 scrapy - python 中将多个 URL 保存为每个 StartURL 文件?

c# - Cortana RequestDisambiguationAsync 错误

c++ - 在循环中使用 av_read_frame 缓存 AVFrame 只会得到最后几帧

c++ - 状态机设计处理数据输入

Python - 覆盖类变量的初始化

python-3.x - 使用 Selenium 修改 HTML

c# - 如何在 Windows 10 应用中实现应用内购买?

windows-10 - 如何通过exe文件将连接重定向到特定的外部IP地址