swig没有名为_example的模块

时间:2010-11-04 08:58:22

标签: c++ python gcc swig

我无法在Windows上重现基本的SWIG示例。 我的错误在SWIG文档中说明,我确信我会提到他们提到的2个修复程序。对于此错误:

>>> 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文件明确指出:

忘记前导下划线(_)。

忘记前导下划线(_)。&gt;如果收到此消息,则表示

  你忘了编译了   包装器代码到扩展模块中   或者你没有给出扩展名   模块正确的名称。确保这一点   你把包装器编译成了一个   名为 example.so的模块。不要   忘记前导下划线()。忘记前导下划线(_)。

我确信我链接了最新的wrap对象构建,我试过了:“_ 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 个答案:

答案 0 :(得分:3)

库的文件名必须是* .pyd。我想你已经生成了一个包装器代码并将它们链接在一起。

答案 1 :(得分:1)

我发现你必须将C ++在.dll上生成的库文件重命名为.pyd。我不记得你是否需要在苹果上重命名它。并且你想要暴露给python的函数必须在它之前有extern“C”。否则,编译器不会使该函数在库外部可访问。另外如果我想如果你想在python中使用它们,你需要将返回值包装在Py_value中。

答案 2 :(得分:0)

我发现(在windows中),如果你创建一个dll,它必须被称为_modulename.pyd 这个库(_modulename.pyd),原始的c ++模块myapp.dll和生成的modulename.py必须在路径中以及pythonxx.exe