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

2024-04-23 13:41:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正面临着一个与SWIG/C++无关的跨泥问题,我无法解决。你知道吗

让我们考虑一个模块M1,它包含一个类C和一组它的方法。该模块是通过C++通过SWIG生成的,其中M1是相应的共享库。你知道吗

M1.py型

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

我想用一个额外的方法扩展这个CL类。我知道,如果在同一个模块中进行扩展,则以下操作将起作用:

一级

%{
#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:

平方米/年

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

呼叫某物()然后在逻辑上失败,因为某事物没有在M2中定义。你知道吗

然后我去了:

M2.i级

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

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

这使得“import M1”指令出现在生成的M2.py中,但没有扩展方法,因此

cl = CL()
cl.SthElse() 

将在属性错误时失败。你知道吗

从现在起我有点迷路,没有更多的想法。Swig文档没有帮助(或者我没有找到正确的章节)。你知道吗


Tags: 模块方法pyreturnincludecldefargs