swig 找不到模块 _example

11 投票
3 回答
10659 浏览
提问于 2025-04-16 06:33

我在Windows上无法复现基本的SWIG示例。我的错误在SWIG文档中有说明,我确定我做了他们提到的两个修复。关于这个错误:

>>> import example
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "example.py", line 2, in ?
    import _example
ImportError: No module named _example

SWIG文档明确指出:

要忘记前面的下划线 (_)。

如果你看到这个信息,说明:

你要么忘了把包装代码编译成扩展模块,要么没有给扩展模块起对的名字。确保你把包装代码编译成一个叫 example.so 的模块。并且不要忘记前面的下划线 (_)。

我确定我链接的是最新的包装对象构建,我尝试过:"_example"、"_example.so"、"example.dll"、"example.so"、"example.dll",甚至同时尝试所有这些,并且生成的 "example.py" 和共享库在同一个文件夹里,Python的路径也包含这个目录。

示例:

//example.h
int foo_sum(int a, int b);

.

//example.cpp
int foo_sum(int a, int b) {
    return a + b;
}

.

//example.i
%module example
%{
#include "example.h"
%}

#include "example.h

还有构建命令:

gcc -IV:\temp\example\external\include\Python -O3 -Wall -c -fmessage-length=0 -oexample_wrap.o ..\example_wrap.c
g++ -IV:\temp\example\external\include\Python -O3 -Wall -c -fmessage-length=0 -oexample.o ..\example.cpp
g++ -LV:\temp\example\external\lib -shared -oexample.dll example_wrap.o example.o -lpython26

即使我不使用 -O3,它仍然不工作(我从发布配置中粘贴了构建命令)

我也尝试了这个,但没有成功:

>>> import sys
>>> sys.path.append("/your/module/path")
>>> import example

编辑:

显然,如果你把dll重命名为 "_example.pyd",它会加载,但加载的模块不包含我的 "foo_sum" 函数。

编辑:现在可以了,我使用了 extern "C",并且没有在 .i 文件中包含头文件。

3 个回答

1

我发现,在Windows系统上,C++生成的库文件需要把后缀从.dll改成.pyd。我不太记得在苹果电脑上是否也需要这样做。另外,你想要让Python调用的函数前面要加上extern "C"。否则,编译器就不会把这个函数暴露出来,让外部使用。还有,如果我没记错的话,如果你想在Python中使用返回值,需要把它们包裹在一个Py_value里面。

2

我发现,在Windows系统中,如果你创建一个dll文件,它必须叫做 _modulename.pyd。这个库 (_modulename.pyd)、原始的C++模块 myapp.dll,以及生成的 modulename.py 都需要放在同一个路径下,还要有 pythonxx.exe。

6

这个库的文件名必须是以*.pyd结尾的。我想你应该已经生成了一个包装代码,并把它们链接在一起了。

撰写回答