SWIG 没有找到名为 _example 的模块。

11

我无法在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文件中包含头文件。


13
你应该写下你的答案并将其标记为正确 - 这样你就可以获得自学者徽章。这可以防止像我这样的人在未回答列表上查找你的问题,结果发现一切都没问题了。 - Tom
3个回答

6

库文件的文件名必须为*.pyd。我假设你已经生成了一个包装器代码并将其链接在一起。


2

我发现在windows系统中,如果你想创建一个dll文件,那么这个文件必须被命名为_modulename.pyd。同时,原始的c++模块myapp.dll以及产生的modulename.py文件也必须放在路径下,并且与pythonxx.exe文件在同一目录下。


1

我发现在Windows上,你必须将C++生成的库文件从.dll重命名为.pyd。我不记得在苹果上是否需要重命名。你想要暴露给Python的函数必须在其前面加上extern "C"。否则编译器不会使该函数在库外可访问。此外,如果我没记错的话,如果你想在Python中使用返回值,你需要将它们包装在Py_value中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接