iterate returned vector<pair<int,int>> in python from SWIG bindings
我发现这个非常有用的问题和答案:返回向量< < int,int >和>从C++方法到使用SWIG类型映射的元组Python列表
但是,我在迭代返回向量时遇到了一些问题,如果返回向量不是引用,下面的示例:
我的H类:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <vector> #include <utility> using std::vector; using std::pair; class MyClass { private: vector<pair<int,int> > _myvector; public: MyClass( ); const vector<pair<int,int> > & GetMyVector() const; }; |
myclass.cpp:
1 2 3 4 5 6 7 8 | #include"myclass.h" MyClass::MyClass(): _myvector() {_myvector.push_back(std::make_pair(1,2));_myvector.push_back(std::make_pair(1,2));}; const vector<pair<int,int>> & MyClass::GetMyVector() const { return _myvector; }; |
号
我的班级。我:
1 2 3 4 5 6 7 8 9 10 11 12 13 | %module x %include <std_pair.i> %include <std_vector.i> %include <std_string.i> %template() std::pair<int,int>; %template(PairVector) std::vector<std::pair<int,int> >; %{ #include"myclass.h" %} %include"myclass.h" |
编译时使用:
1 2 3 4 | g++ -std=c++11 -c -fPIC myclass.cpp swig -c++ -v -python myclass.i g++ -std=c++11 -fPIC -c myclass.cpp myclass_wrap.cxx -I/usr/include/python2.7 g++ myclass.o myclass_wrap.o -shared -fPIC -o _x.so |
。
但是当我在python中运行类似这样的代码时:
1 2 3 4 5 6 7 8 | import x b=x.MyClass() print(b.GetMyVector()) for a,b in b.GetMyVector(): print(a,b) |
然后我得到:
1 2 3 4 5 6 7 | <Swig Object of type 'vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > *' at 0x7ff06804b1b0> Traceback (most recent call last): File"Test.py", line 6, in <module> for a,b in b.GetMyVector(): TypeError: 'SwigPyObject' object is not iterable |
。
如何在python中正确迭代返回的向量?为什么返回向量指针?我需要更改swig文件中的内容吗?
如果相关:(在Ubuntu上)
- swig版本2.0.11
- G++(Ubuntu 4.9.4-2 Ubuntu1~14.04.1)4.9.4
- Python2.7.6
Swig不正确理解
与此问题和答案相同:在Python中使用"使用STD::vector"时的SWIG参数错误
至于返回指针的原因,那么,如果swig无法将返回的对象转换为python对象,那么它会将指向该对象的指针包装起来。