如何使用 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++?