【发布时间】:2021-11-11 07:20:32
【问题描述】:
在 SWIG 中,我有一个在 Python 中继承的封装 C++ 基类。 C++ 端调用 Python 派生类的回调,效果很好。不幸的是,回调的参数之一是作为引用传递的。访问此参考会产生:
致命的未处理异常:SWIG 导向器方法错误。检测到错误 调用“Base.Start”时
test.i
%module(directors="1", allprotected="1") test
%feature("director") Base;
class Base
{
public:
virtual bool Start(const Property& config) = 0; // PASSED AS REFERENCE
};
enum PropertyType{PT_REAL, PT_STRING};
class Property
{
public:
PropertyType GetType() const;
int GetSize() const;
};
在 Python 中,Start 被正确回调/调用。不幸的是,调用GetType() 或GetSize() 会产生上述错误。调用作为指针传递的参数的函数很好。
import test
class PyClient(test.Base):
def Start(self, config):
config_size = config.GetSize() // YIELDS ERROR
config_type = config.GetType() // YIELDS ERROR
return True
我想我需要将参数 Property 从引用转换为指针,但我不清楚这在 SWIG 中是如何工作的。
更新
似乎调用回调中的参数与在Python 端创建时的基础类型不同。
def Start(self, config):
prop_test = test.Property()
type_test = prop_test.GetType() #FINE
type_test2 = config.GetType() # ERROR
当在Start() 的Python 端创建Property (prop_test) 时,其类型为
<mds.Property; proxy of <Swig Object of type 'Property *' at 0x000001CC24DA3D80> >
而传递的属性有一个类型
<Swig Object of type 'Base::Property *' at 0x000001CC24CBE1E0>
我想知道这是否是预期的,或者这可能会导致根本问题。
痛饮 4.0.2
任何帮助将不胜感激。
本
【问题讨论】:
-
创建一个minimal reproducible example。这不会建立复制,我对填补空白的猜测对我有用。您不需要任何特殊处理,我只是从您的部分代码中做了最少的工作以使其编译和运行。
-
是的,根据您的更新,如果没有代理包装器,它将无法正常工作。它是指向 Python 的不透明指针。在我的示例中,无论是由 Python 还是 C++ 代码创建,都有一个代理包装器,那么您如何将
PyClient实例从 Python 传递到 C++ 中?你没有表现出来。 再次发minimal reproducible example。 -
Aslo,您使用的是什么版本的 SWIG?我正在使用 4.0.2(最新)。
标签: python c++ inheritance callback swig