gpt4 book ai didi

在 SWIG 中携带自定义 Python 数据的 C++ 对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:34 29 4
gpt4 key购买 nike

有没有办法让 SWIG 包装的 C++ 对象在 C++ 和 Python 之间来回传递时携带自定义 Python 数据?示例:

example.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

%{
#include "example.h"
%}

%include "example.h"

测试.py

import Example

a = Example.MyClass()
a.bar = "Puppies"

Example.consume(a)
b = Example.eject()

## Should output "Puppies"
print b.bar

当前输出是一个“AttributeError: bar”。

有没有办法获得这种功能?如果可以自定义 SWIG 的 _getattr_ MyClass 函数,那么可能可以从内部 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,而不是现有值,我找不到官方方法来访问类型映射中的现有值。以上取决于 SWIG 将对象 (MyClass *) 命名为 arg1。有效,但可能无法跨 future 的 SWIG 版本移植。

2) Python代码必须是a.data.bar = "Puppies"。这没问题,但并不完美。

3) 它要求类有一个data 成员。这对我当前的需求来说没问题,可以由基类处理。

4) 类的析构函数也必须知道数据,并清理它。同样,可以满足我当前的需求,但有些麻烦。

关于在 SWIG 中携带自定义 Python 数据的 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5546344/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com