How to expose std::vector<int> as a Python list using SWIG?
我尝试使用swig将此函数公开给python:
1 | std::vector<int> get_match_stats(); |
我希望swig为python生成包装代码,这样我就可以把它看作一个整数列表。
将此添加到.i文件:
1 2 3 4 5 6 7 | %include"typemaps.i" %include"std_vector.i" namespace std { %template(IntVector) vector<int>; } |
号
我在运行
我可以访问一个列表,但是在用EDCOX1(1)(用EDCOX1,3)编译时,我得到了一组警告:生成的C++代码:
1 | warning: dereferencing type-punned pointer will break strict-aliasing rules |
我是否正确地暴露了功能?如果是这样,警告意味着什么?
这些是同一功能中违规行之前的行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | SWIGINTERN PyObject *_wrap_IntVector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; std::vector *arg1 = (std::vector *) 0 ; std::vector::iterator arg2 ; std::vector::iterator result; void *argp1 = 0 ; int res1 = 0 ; swig::PySwigIterator *iter2 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:IntVector_erase",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1),"in method '""IntVector_erase""', argument""1"" of type '""std::vector *""'"); } arg1 = reinterpret_cast * >(argp1); |
。
这是冒犯的一句话:
1 | res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::PySwigIterator::descriptor(), 0); |
接下来还有更多的代码。
使用G++4.2.4编译时生成的警告是:
1 2 | swig_iss_wrap.cxx: In function ‘PyObject* _wrap_IntVector_erase__SWIG_0(PyObject*, PyObject*)’: swig_iss_wrap.cxx:5885: warning: dereferencing type-punned pointer will break strict-aliasing rules |
。
1 | %template(IntVector) vector<int>; |
我对SWIG没有太多的经验,但是你是否在你的.i文件中包含C++头文件?尝试其中一个(或两个)
1 2 3 4 5 6 | %include"myvector.h" %{ # include"myvector.h" %} |
号