类型映射资源以及将列表转换为向量(以及反之)

2023-12-19

我正在使用 SWIG 将 c++ 包装在 python 中,并且需要使用类型映射以使我的 python 脚本尽可能简单。作为第一次尝试,我只是发送 2 个列表,将它们转换为向量,将两个向量相加,然后将结果返回到新列表中。

我的问题是,我发现 SWIG 手册没有太多指导意义,很难理解,并且没有给出任何可靠、完整的示例来说明如何编写自己的类型映射。

我的问题是:

  1. 我将如何确保我的列表正确转换为向量,然后再转换回来?
  2. 对于如何编写类型映射以及所有语法/函数的含义,是否有更好的教程/参考?

这是我的代码:

添加数组.h

#include <vector>
#include <functional>

std::vector<int> add_array(std::vector<int> src1, std::vector<int> src2);

添加数组.i

%module add_array
%{
#include "add_array.h"
%}

%include std_vector.i 
%template(vectorInt) std::vector<int>;

%include "add_array.h"

添加数组.cpp

#include "add_array.h"
#include <cassert>
#include <cstring>

std::vector<int> add_array(std::vector<int> src1, std::vector<int> src2) {  
  assert(src1.size() == src2.size());
  std::vector<int> dst;
  dst.resize(src1.size());

  for (size_t i = 0; i < src1.size(); i++) {
    dst[i] = src1[i] + src2[i];
  }
  return dst;
}

Makefile

all:
rm -f *.so *.o *_wrap.* *.pyc *.gch add_array.py
swig -c++ -python add_array.i
g++ -fpic -c add_array_wrap.cxx add_array.h add_array.cpp -I/home/tools/anaconda3/pkgs/python-3.7.3-h0371630_0/include/python3.7m/
g++ -shared add_array_wrap.o add_array.o -o _add_array.so

array.py (这是我正在运行的文件)

import add_array

a = [1, 2, 3, 4, 5, 6]
b = [5, 6, 7, 8, 9, 10]
c = add_array.add_array(a, b)
print(c)

Output:(6、8、10、12、14、16)

这是作为一个元组出现的(我希望它是一个列表)。 看起来我很幸运它可以将输入列表转换为向量(而在另一个方向则不太幸运),但我真的很想知道这是如何发生的以及如果需要的话如何为未来的代码更改它。

Thanks!


我不知道是否有具体原因,但其中包括std_vector.i将输出向量转换为元组而不是列表。如果您想要一个列表,则需要编写自定义类型映射。

示例(无错误检查):

%module add_array
%{
#include "add_array.h"
%}

%include <std_vector.i>
%template(vectorInt) std::vector<int>;

// Override the template output typemap with one that returns a list.
// An "out" typemap controls how a value is returned.
// When a function returns std::vector<int> this template will convert it to
// a Python object.  In this case, a PyList.
// 
// Note: PyObject* tmp declares a local variable that will be used by this code snippet.
// Make sure to look at the generated wrapper code and find the add_array_wrap function
// and how this code is integrated into it.
// 
%typemap(out) std::vector<int> (PyObject* tmp) %{

    // Allocate a PyList object of the requested size.
    // $1 references the first type in the type list (in this case, std::vector<int>)
    // and represents the c++ return value of a function that returns
    // this type; therefore, we can call methods on that value to get the size.
    //
    // Note: The elements of the new PyList are null pointers and MUST be
    //       populated before returning it to Python.
    //
    tmp = PyList_New($1.size());

    // Populate the PyList.  PyLong_FromLong converts a C++ "long" to a
    // Python PyLong object.  PyList_SET_ITEM takes a PyList object (tmp),
    // an index (i), and a Python object to put in the list.  This particular
    // function *steals* the reference to the Python object, so you don't have to
    // Py_DECREF the object to free it later.
    //
    for(int i = 0; i < $1.size(); ++i)
        PyList_SET_ITEM(tmp,i,PyLong_FromLong($1[i]));

    // $result is where you assign the Python object that should be returned
    // after converting the C++ $1 object.  SWIG_Python_AppendOutput is not
    // well-documented, but it appends the return object to an existing
    // returned object.  It's most useful for "argout" typemaps where multiple
    // output or in/out arguments in C++ can be returned as a tuple of
    // return values in Python.  For example, a function like:
    //
    //     void func(int* pValue1, int* pValue2);
    //
    // would normally return None ($result = Py_None), but an "argout" typemap
    // could *$1 to a PyLong and use SWIG_Python_AppendOutput to add it to
    // the result.  The template would be applied twice and you'd get a tuple.
    //
    $result = SWIG_Python_AppendOutput($result,tmp);
%}

%include "add_array.h"

Output:

>>> import add_array
>>> add_array.add_array([1,2,3],[4,5,6])
[5, 7, 9]

就教程而言,我只阅读过 SWIG 文档和 C 语言扩展的特定语言文档。就文档而言,它实际上相当不错,但您不能只是挑选要阅读的内容。研究前十几节的基础知识,然后跳到特定于语言的部分(例如 Python)。 SWIG 安装下也有一个 Examples 目录。

参考:

  • PyLong_FromLong https://docs.python.org/3/c-api/long.html#c.PyLong_FromLong
  • PyList_New https://docs.python.org/3/c-api/list.html?highlight=pylist_new#c.PyList_New
  • PyList_SET_ITEM https://docs.python.org/3/c-api/list.html?highlight=pylist_new#c.PyList_SET_ITEM
  • 标准向量.i http://www.swig.org/Doc3.0/SWIGDocumentation.html#Library_std_vector

您必须查看 SWIG 源才能获取有关 SWIG_Python_AppendOutput 的任何信息。或者只是谷歌搜索其他例子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型映射资源以及将列表转换为向量(以及反之) 的相关文章

  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • sqlite3 从 C 批量插入?

    我遇到了 import 命令来执行此操作 批量插入 但是是否有一个可以使用 sqlite3 exec 执行的查询版本 我只想将一个小文本文件内容复制到表中 下面这个的查询版本 import demotab txt mytable Sqlit
  • 在 ActionbarSherlock 中设置进度条样式

    ActionbarSherlock 中的水平进度条太细 很难看到 我怎样才能将其设计得厚一些像素 我尝试通过继承 Widget Sherlock Light ProgressBar Horizo ntal 的样式来在 styles xml
  • 流畅的 NHibernate 一对多关系设置外键为 null

    我有一个简单的 Fluent NHibernate 模型 其中包含两个相关的类 public class Applicant public Applicant Tags new List
  • Django模型表单过滤器查询集

    我有以下模型 class Article models Model title models CharField description models TextField author models ForeignKey User clas
  • 使用JQuery在Head标签中添加元数据

    我正在尝试在 Head 中插入一个新的元标记 我使用的内容管理系统不允许在 Head 中进行编辑 因此我尝试使用 jQuery 来执行此操作 不幸的是我不能工作 这是我添加到以下网页的代码 http www newcastlegateshe
  • Handlebars:访问已被拒绝解析“来自”的属性,因为它不是其父级的“自己的属性”

    我正在使用 Nodejs 后端 并使用把手进行服务器端渲染 读完一篇后doc车把中的对象数组 其中包含键 content 和 from 但是当我尝试使用 each循环遍历对象数组 出现错误 Handlebars 解析属性 from 的访问被
  • Twilio 视频将参与者静音

    由于新的 Twilio 视频 API 和缺乏文档 我无法弄清楚如何在视频通话中将参与者 甚至是本地参与者 静音 请帮忙 控制单个设备的静音 取消静音或暂停 取消暂停状态LocalAudioTrack of LocalVideoTrack 您
  • MyBatis Spring MVC 错误:无效的绑定语句(未找到)

    这是我尝试使用 MyBatis 执行简单查询时的堆栈跟踪 org apache ibatis binding BindingException Invalid bound statement not found com my package
  • Rails 3:通过API向用户返回大量数据

    我的应用程序有一个 API 用户可以请求数据 有时 这些数据需要时间来处理 并且会破坏我的代码 我需要一个解决方案 我正在考虑使用delayed job 但我不确定这是如何工作的 如果用户提出请求 我需要给他一个答案 即使我在后台处理数据
  • 在 WCF 客户端中查找 Stream 对象的长度?

    我有一个 WCF 服务 它使用上传文档Stream class 现在在此之后 我想获取文档的大小 流的长度 以更新文件大小的文件属性 但这样做时 WCF 会抛出异常 Document Upload Exception System NotS
  • Excel:列/行/矩阵之间数据转换的公式

    是否有公式将列中的数据转换为矩阵或行 以及从 到其他组合的转换 更复杂的情况又如何 将宽度为 W 的矩阵重塑为宽度为 N W 的矩阵 还有一些类似或相关的问题 我已经回答了其中一些 标有 我不断更新此列表 因为添加了新的类似 或相同 问题
  • 更新大型 CakePHP 模型,但*不*触及某些字段?

    使用 CakePHP 1 3 我在 CakePHP 中有一个相当大的模型 我希望在表单页面上有一些隐藏元素 以便在保存之前 手动 进行比较 验证 但是当执行saveAll 经过验证 我不希望出现这些字段 本质上是为了避免它们被更新 处理这个
  • Angular2-如何将表单上的“touched”属性设置为 true

    我的组件中有一个反应式表单 我想设置touched每个输入的属性等于true 我当前的代码执行此操作 但它会引发错误Cannot set property touched of
  • 如何在不使用任何操作类的情况下使用 Struts2 约定

    在Struts2中我们可以定义action而不使用action类struts xml如下
  • Django 中的双外键?

    有没有办法在 Django 中模拟双外键 例如 如果我有表格 音频 覆盖 html 表 timeline item 它有一个字段 id 以及一个指定音频 覆盖或 html 的字段类别 有谁知道我将如何在 Django 中对此进行建模 或者是
  • 将选择结果转换为插入脚本 - SQL Server

    我有 SQL Server 2008 SQL Server Management Studio 我需要从一个数据库中的表中选择数据并将其插入到另一个数据库中的另一个表中 如何将我的选择返回的结果转换为INSERT INTO 评论澄清 虽然我
  • 如何复制 Core Data 托管对象?

    我有一个托管对象 A 其中包含各种属性和关系类型 并且它的关系也有自己的属性和关系 我想做的是 复制 或 复制 以对象 A 为根的整个对象图 从而创建一个与 A 非常相似的新对象 B 更具体地说 B 或其子级 包含的任何关系都不应指向与 A
  • 使用水平滚动条滚动面板

    如何将水平滚动条应用于面板 我正在开发二维平铺地图编辑器 并使用面板来保存内容 当我的地图比面板大时 它就会消失并变得不可见 是否可以应用自定义滚动条 The Panel http msdn microsoft com en us libr
  • 如何在c#中查找名称以某个字符串开头的HTML元素的数量?

    我不确定该主题是否很好地描述了我的问题 但我正在使用 jQuery 动态创建一些 HTML 元素 文本框 而且我永远不知道将创建多少个元素 它循环通过数据库 然后我想获取后面代码中的所有元素并执行一些操作 将它们插入到另一个数据库中 我知道
  • 类型映射资源以及将列表转换为向量(以及反之)

    我正在使用 SWIG 将 c 包装在 python 中 并且需要使用类型映射以使我的 python 脚本尽可能简单 作为第一次尝试 我只是发送 2 个列表 将它们转换为向量 将两个向量相加 然后将结果返回到新列表中 我的问题是 我发现 SW