如何在带有 Swig 的 Python 中使用 float **?

Posted

技术标签:

【中文标题】如何在带有 Swig 的 Python 中使用 float **?【英文标题】:How to use float ** in Python with Swig? 【发布时间】:2010-06-18 08:56:12 【问题描述】:

我正在为一些 c 函数编写 swig 绑定。其中一个函数需要一个浮点数**。我已经将cpointer.i 用于普通指针并查看了carrays.i,但我没有找到声明浮点数** 的方法。你有什么推荐的?

接口文件:

extern int read_data(const char *file,int *n_,int *m_,float **data_,int **classes_);

【问题讨论】:

我猜 read_data() 函数采用这些指向指针的指针,以便它们可以返回值?您可以考虑更改 Python 函数以将它们作为返回值的一部分返回。 @Petriborg,问题是,我必须返回“类”、“数据”、“m”和“n”,而且我不应该使用结构。 【参考方案1】:

此答案是对 Framester 发布的有关使用 ctypes 而不是 swig 的相关问题的转贴。我已将其包含在此处,以防任何网络搜索出现指向他原始问题的链接。

我在几个项目中使用过 ctypes 现在和一直很满意 结果。我不认为我个人 需要一个指针到指针的包装器 但是,理论上,你应该能够 执行以下操作:

from ctypes import * 

your_dll = cdll.LoadLibrary("your_dll.dll") 

PFloat = POINTER(c_float) 
PInt   = POINTER(c_int) 

p_data    = PFloat() 
p_classes = PInt() 
buff      = create_string_buffer(1024) 
n1        = c_int( 0 ) 
n2        = c_int( 0 ) 

ret = your_dll.read_data( buff, byref(n1), byref(n2), byref(p_data), byref(p_classes) ) 

print('Data:    ', p_data.contents) 
print('Classes: ', p_classes.contents) 

【讨论】:

以上是关于如何在带有 Swig 的 Python 中使用 float **?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SWIG 包装一个在 python 中接收函数指针的 c++ 函数

SWIG:将 2d numpy 数组传递给 C 函数 f(double a[])

带有类型推导的 swig python 模板函数

带有 SWIG 的 C++ 数组到 Numpy 的 TypeError 问题

如何在 SWIG 中为 c++ 创建模板函数?

带有模板类的 SWIG SHARED_PTR 宏