使用 SWIG 在 Python 中访问 C++ typedef

Posted

技术标签:

【中文标题】使用 SWIG 在 Python 中访问 C++ typedef【英文标题】:Accessing C++ typedef in Python using SWIG 【发布时间】:2011-11-16 16:34:52 【问题描述】:

我有一个 C++ API,我试图用 Python 封装。我想调用一个包装的 C++ 函数 myfunc 作为参数,下面的 C++ typedef

/* my_header.h */

namespace my_namespace 
typedef std::vector<Foo> Bar

其中 Foo 是一个 C++ 类。我设法包装了函数和底层类 Foo,但我不知道如何创建 Foo 的向量。我将 .h 文件包含在我的 SWIG .i 文件中,如下所示

/* my_interface.i */

%
#include "my_header.h"
typedef my_namespace::Bar Bar;
%

%include "my_header.h"

我也尝试在 SWIG 中包装 std::vector 模板,如下

%include std_vector.i
namespace std 
    %template(vector_foo) vector<Foo>;

这行得通,我可以在 Python 中导入 vector_foo。但是,当我将 vector_foo 作为参数发送给上述函数时,我得到一个 TypeError。我也不能用 Foo 填充 vector_foo。

在 Python 中,我执行以下操作

>>> a = mymodule.vector_foo()
>>> a
<Swig Object of type 'std::vector <Foo, std::allocator< Foo > > *'
>>> mymodule.myfunc(a, 'string')
TypeError: in method 'myfunc', argument 1 of type 'my_namespace::Bar &'

如果我可以使自己的 Foo 向量实现工作,或者以某种方式直接访问 C++ typedef。我正在调用 SWIG 并使用 Python Distutils 进行编译。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我解决了。

似乎问题是我不得不告诉 SWIG 接口文件中 % % 大括号中已经存在的 typedef,即

/* my_interface.i */

%
#include "my_header.h"
typedef my_namespace::Bar Bar;
%

typedef my_namespace::Bar Bar;
%include "my_header.h"

虽然我不是 100% 认为这是错误的。无论如何,我现在有一个像上面那样的接口文件并且包装工作。

【讨论】:

%include 之前定义typdef 是否重要?我假设您需要像在% ... % 中那样定义它,它位于#include 之后

以上是关于使用 SWIG 在 Python 中访问 C++ typedef的主要内容,如果未能解决你的问题,请参考以下文章

无法从使用 SWIG 创建的 python 访问 C++ 扩展模块及其方法

在 python swig 中读取 c++ 2d 数组

SWIG:你能否使用 SWIG 专门使用 C++ 头文件使 C++ 在 Python 中可用?

SWIG C++ 预编译 DLL

无法使用 SWIG 在 Python 中实例化 C++ 类(获取属性错误)

Swig:在 Python 中使用 c++ STL 复杂