在SWIG中将boost::shared_ptr的std::vector封装为Python

4 投票
3 回答
2976 浏览
提问于 2025-04-16 15:02

编辑:解决了,是我自己的错误;在我的回答中解释了。

我有这个:

std::vector < boost::shared_ptr < Entity > > entities;

然后我尝试通过SWIG来暴露它,像这样:

%include "boost_shared_ptr.i"
%include "std_vector.i"

%shared_ptr(Entity)
%include <Entity.h>

namespace std {
    %template(EntityVector) vector<boost::shared_ptr<Entity> >;
};

%include <TheFileWithEntities.h>

但是,在Python中,结果变成了一个元组:

import MyModule
print type(MyModule.cvar.entities)
# Output: (type 'tuple')

我在网上搜索过这个,但找不到具体的例子来说明怎么包装它。有一个页面给了一个小例子,讲的是如何为C#包装,但对我没有帮助。

任何帮助都非常感谢。

3 个回答

0

可以查看这个链接:如何使用SWIG将std::vector<int>暴露为Python列表?,里面可能有很好的信息。

5

我在把Python中的指针对象序列自动转换成一个std::vector指针对象时遇到了一些困难。目前我在用Swig 1.3,如果你用的是Swig 2,情况可能会有所不同。解决这个问题的关键是在Swig的接口文件中(使用%template)不仅要实例化向量,还要实例化对象和指针对象:

%include "std_vector.i"
%template(myObjectT) namespace::of::myObject<T>;
%template(myObjectPtrT) boost::shared_ptr<namespace::of::myObject<T> >;
%template(myObjectVectorT) std::vector<boost::shared_ptr<namespace::of::myObject<T> > >;

如果没有myObjectPtrT,Swig似乎就不知道怎么把Python中的指针序列转换成myObjectTmyObjectVectorT

更新:出于某种我还没搞明白的原因,这导致我无法从myObjectPtrT调用myObjectT的方法,尽管我也使用了SWIG_SHARED_PTR(myObjectT, myObject<T>)

0

SWIG 似乎把全局变量类型的 std::vector 包装成了元组。解决这个问题的方法是把这些变量放到一个类里面,然后通过这个类的实例来访问它们。下面是一个例子:

class Globals
{
public:
     std::vector < boost::shared_ptr < Entity > > entities;
};

extern Globals globals;

撰写回答