C++、Python 3.7.4、SWIG 4.0.0 和 Windows 10 的问题 - ModuleNotFoundError
Problems with C++, Python 3.7.4, SWIG 4.0.0 and Windows 10 - ModuleNotFoundError
我正在用 C++ 编写一个即将发布的库。除了库之外,我还向 Python 3.7.4 添加了一个接口,该接口是使用 SWIG 4.0.0 自动生成的。在 Ubuntu 18.04 中,界面完美运行:可以毫无问题地导入到 Python3 中。然而在 Windows10 中,情况并非如此。在用 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
- Python 路径: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
注意变化:
- 在模块名称的开头使用下划线(我早该知道的)。
- Link 对抗 python37 和 python3(第二个完成大部分工作,但两者都是必需的)。
再次感谢@flexo 指出了最重要的问题。
我正在用 C++ 编写一个即将发布的库。除了库之外,我还向 Python 3.7.4 添加了一个接口,该接口是使用 SWIG 4.0.0 自动生成的。在 Ubuntu 18.04 中,界面完美运行:可以毫无问题地导入到 Python3 中。然而在 Windows10 中,情况并非如此。在用 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
- Python 路径: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
注意变化: - 在模块名称的开头使用下划线(我早该知道的)。 - Link 对抗 python37 和 python3(第二个完成大部分工作,但两者都是必需的)。
再次感谢@flexo 指出了最重要的问题。