C+的问题+;,Python 3.7.4、SWIG 4.0.0和Windows 10-ModuleNotFoundError 我正在编写一个C++的图书馆,即将出版。除了库之外,我还向Python 3.7.4添加了一个接口,该接口是使用SWIG 4.0.0自动生成的。在Ubuntu18.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' 文件fact.cpp 文件factorial.i 文件Makefile PYTHON\u INCLUDE=-IC:/programming/Python37/INCLUDE 全部:阶乘 factorial.so:fact.o wrap\u factorial.o g++-o$@-共享$< wrap\u factorial.o:wrap\u factorial.cpp g++-o$@-c$

C+的问题+;,Python 3.7.4、SWIG 4.0.0和Windows 10-ModuleNotFoundError 我正在编写一个C++的图书馆,即将出版。除了库之外,我还向Python 3.7.4添加了一个接口,该接口是使用SWIG 4.0.0自动生成的。在Ubuntu18.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' 文件fact.cpp 文件factorial.i 文件Makefile PYTHON\u INCLUDE=-IC:/programming/Python37/INCLUDE 全部:阶乘 factorial.so:fact.o wrap\u factorial.o g++-o$@-共享$< wrap\u factorial.o:wrap\u factorial.cpp g++-o$@-c$,c++,python-3.x,windows-10,mingw,swig,C++,Python 3.x,Windows 10,Mingw,Swig,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 ModuleNotFoundE

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'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Users\Usuari\factorial.py”,第15行,在
导入因子
ModuleNotFoundError:没有名为“\u factorial”的模块
如果你们中的一些人能帮助我解决这个问题,我将非常感激。我以前搜索过这个网站,但没有成功

先谢谢大家


其他可能有用的细节:

  • g++:与MinGW一起安装
  • Windows 10:64位
  • 环境变量包括:
    • PYTHONHOME:C:\programming\Python37
    • PYTHONPATH:C:\programming\python\u 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
      
      PYTHON\u INCLUDE=-IC:\programming\Python37\INCLUDE
      PYTHON\u LIBS\u DIR=-LC:\programming\Python37\LIBS
      全部:_factorial.pyd
      _factorial.pyd:fact.o wrap\u factorial.o
      g++-o$@-shared fact.o wrap_factorial.o$(PYTHON_LIBS_DIR)-lpython3$(PYTHON_LIBS_DIR)-lpython37
      wrap\u factorial.o:wrap\u factorial.cpp
      g++-o$@-c$<$(包括PYTHON)
      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的链接(第二个完成了大部分工作,但这两个都是必需的)


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

      您需要在windows上编译.pyd文件,而不是.so。@flex♦, 当然,这是问题的一部分。还有其他的,现在都修好了。非常感谢。(天哪,最后真是太简单了!)
          %module factorial
          %{
          #include "fact.hpp"
          %}
          %include "fact.hpp"
      
          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
      
           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'
      
          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