【问题标题】:How to expose std::vector<int> as a Python list using SWIG?如何使用 SWIG 将 std::vector<int> 公开为 Python 列表?
【发布时间】:2010-09-21 13:32:10
【问题描述】:

我正在尝试使用 SWIG 将此函数公开给 Python:

std::vector<int> get_match_stats();

我希望 SWIG 为 Python 生成包装代码,以便我可以将其视为整数列表。

将此添加到 .i 文件中:

%包括“typemaps.i” %包括“std_vector.i” 命名空间标准 { %template(IntVector) 向量; }

我正在运行 SWIG Version 1.3.36 并使用 -Wall 调用 swig,但我没有收到任何警告。

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

警告:取消引用类型双关指针将破坏严格别名规则

我是否正确地公开了函数?如果是这样,警告是什么意思?


这些是同一函数中违规行之前的行:

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 结果; 无效 *argp1 = 0 ; 整数 res1 = 0 ; swig::PySwigIterator *iter2 = 0 ; 诠释 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); 如果(!SWIG_IsOK(res1)){ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_erase" "', 参数 ""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:在函数‘PyObject* _wrap_IntVector_erase__SWIG_0(PyObject*, PyObject*)’中: swig_iss_wrap.cxx:5885:警告:取消引用类型双关指针将破坏严格的别名规则

【问题讨论】:

  • 最近的 swig 版本仍会生成导致此类警告的代码。使用 -fno-strict-aliasing 让 g++ 毫无问题地接受 swig 包装器。

标签: c++ python stl swig


【解决方案1】:

我对 Swig 没有太多经验,但是您是否在 .i 文件中包含您的 C++ 头文件?尝试其中一种(或两种)

%include "myvector.h"


%{
#   include "myvector.h"
%}

【讨论】:

    【解决方案2】:
    %template(IntVector) vector<int>;
    

    【讨论】:

    • 这就是我尝试过的,在使用 g++ 编译时我收到了一堆警告。有什么想法吗?
    • 您使用的是什么版本的 g++?我正在使用 4.1.2,即使使用 -Wall,我也没有收到任何警告。当我使用 3.3 左右时,我也不记得有任何警告。请注意原始帖子中缺少的此帖子中的额外“”。
    • 我正在使用 g++ 4.2.4 并尝试使用 -Wall -Werror -ansi -pedantic 构建。我只是尝试使用 -Wall 构建它,但仍然收到警告。
    • 这可能是一个新的 4.2 主义。 gcc 4.2 的底层发生了一些重大变化。您能否发布生成此警告的代码行?
    • 一些旧版本的 SWIG 会生成草率的代码。 GCC 4.2 不太喜欢它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多