SWIG和C ++:从另一个模块扩展一个类

时间:2013-12-05 16:15:29

标签: c++ python swig

我正面临SWIG / C ++的交叉问题,我无法解决这个问题。

让我们考虑一个包含C类的模块M1及其一组方法。该模块由C ++通过SWIG生成,_M1是相应的共享库。

M1.py

class CL(_object):
    def Sth(*args): return _M1.CL_Sth(*args)

我想用另一种方法SthElse扩展这个CL类。我知道如果扩展在同一个模块中完成,以下内容将起作用:

CL.i

%{
#include "CL.h"
%}
%include "CL.h"
%extend CL {
    void SthElse() { return; }
}

然而,我担心的是扩展不能在M1模块中完成,必须在模块M2外部完成。

我首先尝试执行以下操作:

M2.i

%module M2
%{
#include "CL.h"
%}
%include "CL.i"

%extend CL {
  void SthElse() { return; }
}

这导致了M2.py创建,其中包含CL方法和新方法。问题是CL不再是M1的CL而是M2.CL:

M2.py

class CL(_object):
    def Sth(*args): return _M2.CL_Sth(*args)
    def SthElse(*args): return _M2.CL_SthElse(*args)

调用CL.Sth()然后逻辑失败,因为未在M2中定义Sth。

然后我去了:

M2.i

%module M2
%{
#include "CL.h"
%}
%import(module="M1") "CL.h"

%extend CL {
  void SthElse() { return; }
}

这使得“导入M1”指令出现在生成的M2.py中,但没有扩展方法,所以

cl = CL()
cl.SthElse() 

会因属性错误而失败。

从现在开始,我有点失落,没有更多的想法。 Swig文档没有帮助(或者我找不到合适的章节)。

1 个答案:

答案 0 :(得分:0)

您是否忘记启用导演快速功能?请参阅文档here,特别是enabling directors