如何使用 SWIG 将 C++ 数组转换为 Python 列表?

Posted

技术标签:

【中文标题】如何使用 SWIG 将 C++ 数组转换为 Python 列表?【英文标题】:How to convert a C++ array to a Python list using SWIG? 【发布时间】:2014-02-03 23:31:46 【问题描述】:

我正在尝试用 C++ 编写一段代码,它可以生成一个数组并将其作为 Python 列表返回。我知道我可以使用 numpy.i 中的类型映射将列表作为 NumPy 数组返回,但我正在使用的某些集群上没有安装 NumPy。这个问题与我在这里看到的一些类似问题的主要区别在于,我想将可变长度的 C 数组作为 Python 列表返回。

精简的 C++ 例程如下:

/* File get_rand_list.cpp */
#include "get_rand_list.h"

/* Define function implementation */ 
double* get_rand_list(int length) 

  output_list = new double[length];

  /* Populate input NumPy array with random numbers */
  for (int i=0; i < length; i++)
    output_list[i] = ((double) rand()) / RAND_MAX;

  return output_list;

我希望能够在 Python 中这样使用它:

from get_rand_list import *
list = get_rand_list(10)

这将返回一个包含 10 个随机浮点数的 Python 列表。如何使用 SWIG 类型映射来包装 C++ 例程来执行此操作?如果有更简单的方法需要对 C++ 例程进行一些小的修改,那很可能没问题。

【问题讨论】:

【参考方案1】:

由于您使用的是 C++,因此最容易使用 STL:SWIG 知道如何将 std::vector 转换为 Python 列表,因此请使用

std::vector<double> get_rand_list(int length)  ... 

别忘了 %import std_vector.i。这个技巧通常非常有用,请参阅Library section of SWIG docs 了解其他预先编写的类型图。总是喜欢预先编写的类型图而不是自己制作。

【讨论】:

【参考方案2】:

这个问题已经回答了好几次了

return double * from swig as python list

SWIG C-to-Python Int Array

【讨论】:

但目前的答案只适用于设定的数组大小。我对可变长度数组感兴趣。

以上是关于如何使用 SWIG 将 C++ 数组转换为 Python 列表?的主要内容,如果未能解决你的问题,请参考以下文章

Swig:将成员变量(指向值的指针)转换为 python 列表

如何使用 Swig 将 unsigned char* 转换为 Python 列表?

如何在 SWIG 中将向量的锯齿状 C++ 向量转换(类型映射)为 Python

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?

Python SWIG:将 C++ 返回参数转换为返回值,并将原始 C++ 类型转换为 Python 类型

使用 SWIG 将 C++ <vector> 包装为 python NumPy 数组