如何通过SWIG将std::vector<int>暴露为Python列表?

18 投票
2 回答
17465 浏览
提问于 2025-04-11 19:40

我正在尝试使用SWIG将这个函数暴露给Python:

std::vector<int> get_match_stats();

我希望SWIG能为Python生成包装代码,这样我就可以把它当作一个整数列表来看。

我在.i文件中添加了这个内容:

%include "typemaps.i"
%include "std_vector.i"

namespace std
{
  %template(IntVector) vector<int>;
}

我运行的是SWIG Version 1.3.36,并且用-Wall参数调用swig,但没有收到任何警告。

我能够访问到一个列表,但在用-Wall编译时(使用g++ (GCC) 4.2.4),生成的C++代码出现了一堆警告,内容是:

  warning: dereferencing type-punned pointer will break strict-aliasing rules

我这样暴露函数是正确的吗?如果是,那这些警告是什么意思呢?


这是在同一个函数中,出问题的那一行之前的代码:

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);

而这就是出问题的那一行:

  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::PySwigIterator::descriptor(), 0);

后面还有更多代码。

在用g++ 4.2.4编译时生成的警告是:

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

2 个回答

0

我对Swig的经验不多,不过你有没有在你的.i文件里包含你的C++头文件?可以试试下面的一个(或者两个)方法:

%include "myvector.h"


%{
#   include "myvector.h"
%}
14
%template(IntVector) vector<int>;

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答