在SWIG中将boost::shared_ptr的std::vector封装为Python
编辑:解决了,是我自己的错误;在我的回答中解释了。
我有这个:
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中的指针序列转换成myObjectT
的myObjectVectorT
。
更新:出于某种我还没搞明白的原因,这导致我无法从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;