2014-01-30 121 views
3

这可能是简单的但我找不到任何解释。如何访问SWIG Python生成的抽象C++类方法?

给定一个抽象类,这是在别处实现,并且其界面通过导出函数提供:

class IFoo { 
public: 
    virtual ~IFoo(){} 
    virtual void bar()=0; 
}; 

extern IFoo* get_interface(); 

在C++中我会以此为:

IFoo* foo = get_interface(); 
foo->bar(); 

如果我SWIG此,我可以导入模块并将get_interface()分配给一个变量:

import myfoo 
foo = myfoo.get_interface() 

但是我无法接受SS foo.bar():

>>> foo.bar() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'SwigPyObject' object has no attribute 'bar' 

我缺少什么?

谢谢!


这里是整个事情,如果上面的片段不够清晰:

的* .i文件:

%module myfoo 
#define SWIG_FILE_WITH_INIT 

%include "myfoo.h" 
%{ 
#include "myfoo.h" 
%} 

的myfoo.h头:

class IFoo { 
public: 
    virtual ~IFoo(){} 
    virtual void bar()=0; 
    virtual void release()=0; 
}; 

extern IFoo* get_interface(); 

执行文件(myfoo.cpp)

#include "myfoo.h" 
#include <iostream> 

class Foo : public IFoo { 
public: 
    Foo(){} 
    ~Foo(){} 
    void bar(); 
    void release(); 
}; 

void Foo::bar() { 
    cout << "Foo::bar()..." << endl; 
} 

void Foo::release() { 
    delete this: 
} 

IFoo* get_interface() { 
    return new Foo(); 
} 
,你有“导演”
+0

你需要用'%功能( “董事”)IFoo',但我觉得你失去了一些东西附加太多。你能包括一个完整的最小例子而不仅仅是选定的片段吗? – Flexo

回答

2

我发现了这个问题。我在构建系统中生成了一个Ruby扩展。当我决定添加Python绑定时,我只是添加了一个新的(Xcode)目标,就像我为Ruby扩展所做的一样。我不知道的是,swig还生成了一个模块 .py文件,其中包含所有初始化代码(与Ruby不同)。一旦我找到了,我只是将生成的python文件和扩展动态库文件一起移动,然后导入它。现在一切正常。

我发现通过手工创建上面的myfoo代码(与运行我的构建系统,它忽略了额外的myfoo.py文件)。一旦我手动运行swig,我注意到它不仅产生了myfoo_wrapp.cpp,而且产生了myfoo.py。

感谢您的努力。为了将来的参考,这与导演无关(我不想创建双向接口)。它根本不知道由swig生成的额外python初始化代码。

前:

myfoo.i 
myfoo.h 
myfoo.cpp 

>swig -c++ -python myfoo.i 

后:

myfoo.i 
myfoo.h 
myfoo.cpp 
myfoo.py <== Missed this one 
myfoo_wrap.cxx 
+0

+1用于查找解决方案和发布。你应该接受它(如果你可以,不记得)。 – Schollii

0

检查您.i文件开启你的模块:

%module(directors="1") myfoo 

这在部分34.5 "Cross language polymorphism" of SWIG docs讨论。如果它已经打开,请发表评论,我会仔细查看。

+0

是的,我之前根据我在google上发现的一些结果添加了这个结果,但它没有效果。我已经编辑了自己的问题以在* .i文件中显示模块声明。 – Antediluvian