C++;在SWIG中携带自定义Python数据的对象 Pi>是否有一种方法,用于通过SWIG包裹的C++对象,在它们在C++和Python之间来回传递时,携带自定义Python数据?例如:
示例.hC++;在SWIG中携带自定义Python数据的对象 Pi>是否有一种方法,用于通过SWIG包裹的C++对象,在它们在C++和Python之间来回传递时,携带自定义Python数据?例如:,c++,python,attributes,swig,C++,Python,Attributes,Swig,示例.h class MyClass { public: int foo; }; // Black box functions. // Only thing guaranteed is that the last object handed to consume // will be returned by eject. void consume(MyClass *obj); MyClass *eject(); 示例.i %module Example %{ #in
class MyClass
{
public:
int foo;
};
// Black box functions.
// Only thing guaranteed is that the last object handed to consume
// will be returned by eject.
void consume(MyClass *obj);
MyClass *eject();
示例.i
%module Example
%{
#include "example.h"
%}
%include "example.h"
test.py
import Example
a = Example.MyClass()
a.bar = "Puppies"
Example.consume(a)
b = Example.eject()
## Should output "Puppies"
print b.bar
当前输出为“AttributeError:bar”
有没有办法获得这种功能?如果可以自定义SWIG的MyClass的_getattr_uu函数,那么可能可以从内部PyObject*存储和加载未知属性(通过自动创建SWIG子类MyClass,或者通过在MyClass中已经存在这样的对象)
谢谢大家! 这是迄今为止我提出的唯一(部分)解决方案:
class MyClass
{
...
MyClass() : data(NULL) {}
~MyClass() {if(data) Py_DECREF(data);}
PyObject *data;
};
%typemap(in) PyObject* data {
if(arg1 && arg1->data != NULL)
Py_DECREF(arg1->data);
$1 = $input;
Py_XINCREF($1);
}
%typemap(out) PyObject* data {
$result = $1;
}
问题:
1) SWIG将$1
设置为NULL
,而不是现有值,并且我找不到正式的方法来访问typemap中的现有值。以上取决于SWIG将对象(MyClass*)命名为arg1。工作正常,但可能无法在未来的SWIG版本中移植
2) Python代码必须是a.data.bar=“Puppies”
。这没关系,但并不完美
3) 它要求类具有数据
成员。这对于我当前的需要是可以的,并且可以由基类来处理
4) 类的析构函数还必须知道数据,并将其清除。同样,对于我目前的需求来说,还行,但有点麻烦。这是迄今为止我提出的唯一(部分)解决方案:
class MyClass
{
...
MyClass() : data(NULL) {}
~MyClass() {if(data) Py_DECREF(data);}
PyObject *data;
};
%typemap(in) PyObject* data {
if(arg1 && arg1->data != NULL)
Py_DECREF(arg1->data);
$1 = $input;
Py_XINCREF($1);
}
%typemap(out) PyObject* data {
$result = $1;
}
问题:
1) SWIG将$1
设置为NULL
,而不是现有值,并且我找不到正式的方法来访问typemap中的现有值。以上取决于SWIG将对象(MyClass*)命名为arg1。工作正常,但可能无法在未来的SWIG版本中移植
2) Python代码必须是a.data.bar=“Puppies”
。这没关系,但并不完美
3) 它要求类具有数据
成员。这对于我当前的需要是可以的,并且可以由基类来处理
4) 类的析构函数还必须知道数据,并将其清除。同样,对于我目前的需求来说,还行,但有点麻烦