类型为 'std::map< char,int > 的 <Swig 对象的代理
proxy of <Swig Object of type 'std::map< char,int >
从python调用以下代码:
from f_p import form_p
print(form_p([1,2,3]))
给我下面的错误
错误:
(<f_p.mapiv; proxy of <Swig Object of type 'std::map< char,int > *' at 0x7f09778fc270> >,)
如何解决? 我正在尝试在 swig 中为我的 cpp 代码创建一个包装器。代码文件:
f_p.i:
%module f_p
#define SWIGPYTHON_BUILTIN
%{
#include "numpy/arrayobject.h"
#define SWIG_FILE_WITH_INIT /* To import_array() below */
#include "f_p.h"
%}
%include "std_map.i"
%import "std_deque.i"
// %include "numpy.i"
%import "std_vector.i"
#include <deque>
%template() std::vector<int>;
%template (map) std::map<char,int>;
%template(MapDeque) std::deque<std::map<char, int>>;
%include "f_p.h"
f_p.cpp:
#include <deque>
#include <iostream>
using namespace std;
#include <vector>
#include <map>
deque<map<char, int>> form_p(vector<int> inp_list)
{
map<char, int> my_map = {
{ 'A', 1 },
{ 'B', 2 },
{ 'C', 3 }
};
deque<map<char, int>> mydeque;
mydeque.push_back(my_map);
return mydeque;
}
f_p.h:
#ifndef F_P_H
#define f_P_H
#include <stdio.h>
#include <deque>
#include <map>
#include <vector>
/* Define function prototype */
std::deque<std::map<char, int>> form_p(std::vector<int> inp_list) ;
#endif
build.sh:
rm *.o f_p_wrap.cpp _f_p.so f_p.py
rm -rf __pycache__
g++ -O3 -march=native -fPIC -c f_p.cpp
swig -python -c++ -o f_p_wrap.cpp f_p.i
# Next, compile the wrapper code:
g++ -O3 -march=native -w -fPIC -c $(pkg-config --cflags --libs python3) -I /home/kriti/anaconda3/lib/python3.7/site-packages/numpy/core/include f_p.cpp f_p_wrap.cpp
g++ -std=c++11 -O3 -march=native -shared f_p.o f_p_wrap.o -o _f_p.so -lm
我无法获得输出。我不知道如何处理德克的东西。对于地图和矢量,我可以生成结果,但不能使用deque和地图中有字符时。
你标记为"错误"是正确的(或至少是预期的(结果:双端被转换为 Python 元组。要访问您的地图,只需访问第一个元素,然后访问地图:
>>> from f_p import form_p
>>> print(form_p([1,2,3]))
(<f_p.map; proxy of <Swig Object of type 'std::map< char,int > *' at 0x7f16259a1c60> >,)
>>> d = form_p([1,2,3])
>>> len(d)
1
>>> d[0]
<f_p.map; proxy of <Swig Object of type 'std::map< char,int > *' at 0x7f16259aeb40> >
>>> m = d[0]
>>> len(m)
3
>>> m.keys()
['A', 'B', 'C']
>>> m['B']
2
>>> for m in d:
... print m.keys()
...
['A', 'B', 'C']
>>>
编辑:根据评论进行跟进。std::deque
已经有一个"out"类型映射,不幸的是,它匹配得更紧密,所以除非你完全指定std::deque<std::map<char, int>> form_p
(即使用函数名称(,否则它不会匹配,所以下面的示例使用"ret"代替,应用于返回此类 deques 的所有函数。添加到 f_p.i:
%typemap(ret) std::deque<std::map<char, int>> {
$result = PyTuple_New($1.size());
for (int i = 0; i < (int)$1.size(); ++i)
PyTuple_SetItem($result, i, swig::traits_from<std::map<char, int>>::asdict($1[i]));
}
此代码创建一个元组(如果您更喜欢 python 列表,请使用PyList_New
和PyList_SetItem
(,然后循环访问 deque 中的条目并将它们转换为 python 字典。asdict
调用是一个生成的 python 函数,如果您愿意,也可以在 .i 中的 python 后处理代码中使用。
有了这个,结果是:
>>> from f_p import form_p
>>> print(form_p([1,2,3]))
({'A': 1, 'C': 3, 'B': 2},)
>>>
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中