【发布时间】:2020-12-21 14:58:43
【问题描述】:
您好,我正在使用 SWIG 包装 C++,以便在 python 中使用。为了包装 C++ 类,我正在使用 SWIG。我对类型映射没有好主意,因此我被卡住了。我有一个由多个地图组成的矢量,即。 std::vector<:map int>> 我想从 C++ 函数返回它并将其转换为 python 中的 dict 列表。我在网上搜索但找不到任何东西。
我有这样的课:
std::vector<std::map<std::string, int>> WapperCode::wrapper_fuc(){
std::vector<std::map<std::string, int>> outer_vector;
for(int i = 0 ; i < 10 ; i++){
std::map<std::string, int> inner_dict;
inner_dict.insert(std::pair<std::string, int>("first", 1));
inner_dict.insert(std::pair<std::string, int>("second", 2));
inner_dict.insert(std::pair<std::string, int>("third", 3));
outer_vector.insert(outer_vector.begin() + i, inner_dict);
}
return outer_vector;}
我的接口文件包含这个
%module wrapper
%{
#include "wrapper.h"
#include <cstdio>
#include <cstdlib>
#include <sys/stat.h>
#include <map>
#include <vector>
#define SWIG_PYTHON_STRICT_BYTE_CHAR // Swig is giving const char while wrapping bytes.
%}
%include "std_vector.i"
%include "std_map.i"
%include "std_pair.i"
%include "std_wstring.i" // Use this for abby wchar dependency
%include "std_string.i" // Get C++ string
%include "./lib/wrapper.h"
%typemap(out) std::vector< std::map< std::string,int,std::less< std::string >,std::allocator< std::pair< std::string const,int > > >,std::allocator< std::map< std::string,int,std::less< std::string >,std::allocator< std::pair< std::string const,int > > > > > &
{
for(int i = 0; i < $1->size(); ++i)
{
int subLength = $1->data()[i].size();
npy_intp dims[] = { subLength };
PyObject* temp = PyArray_SimpleNewFromData(1, dims, NPY_INT, $1->data()[i].data());
$result = SWIG_Python_AppendOutput($result, temp);
}
}
但是当我从 python 调用这个模块时,我得到了这个:
Out[3]: <Swig Object of type 'std::vector< std::map< std::string,int,std::less< std::string >,std::allocator< std::pair< std::string const,int > > >,std::allocator< std::map< std::string,int,std::less< std::string >,std::allocator< std::pair< std::string const,int > > > > > *' at 0x7f4025d8e810>
【问题讨论】:
-
你熟悉 Swig 模板吗?您可以通过为使用的类型声明模板实例来访问结果。
-
不,我不熟悉。感谢您建议@MarkTolonen,我会看看它。
-
我会用模板的例子来回答...