python3如何从导入的库中为返回类型定义ctypes结构

时间:2012-06-17 00:09:13

标签: python-3.x ctypes fann

我正在尝试使用ctypes在python3中使用fann(用C语言编写的神经网络库)。到目前为止,这是我的删节代码:

from ctypes import *
cdll.LoadLibrary("/usr/local/lib/libdoublefann.dylib")
fann = CDLL("/usr/local/lib/libdoublefann.dylib")


# Call fann to create a neural network
nn = fann.fann_create_from_file(b'/Users/xxxxx/Code/fanncode/net/nnf_25_1339802027.net')

# this outputs 3909360
print(nn)

如果我尝试使用nn变量调用fann库中的任何其他函数(现在应该是一个扇形神经网络),我可以得到Segmentation fault: 11AttributeError: 'int' object has no attribute 'getMSE'(例如)。我认为我的问题是根据ctypes文档,变量nn最终是一个int,而函数fann_create_from_file的fann文档说明:

FANN_EXTERNAL struct fann *FANN_API fann_create_from_file(const char * configuration_file)

所以我想我需要声明:

class FANN_API(Structure):
    <fields and things which I don't know what they should be>

然后做:

fann.fann_create_from_file.restype = FANN_API

我的问题是我找不到结构FANN_API应该是什么。 fann.h的第130行说明#define FANN_API,但就是这样,它没有定义或任何内容。

我猜错了需要定义结构吗?如果是这样,那我怎样才能找到它在python代码中声明的格式?如果没有,那么任何人都可以建议我可能需要做什么/阅读什么来让我的代码工作?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以告诉ctypes参数和函数的返回码。你应该能够使用c_void_p(void *)作为类型,除非你有理由操纵结构的内容:

fann.fann_create_from_file.restype = c_void_p
fann.fann_create_from_file.argtypes = [c_char_p]

请注意struct fann *是函数的返回类型。 FANN_API代表调用约定。你说它被定义为#define FANN_API。被定义为无意义是默认的调用约定,因此您对CDLL的使用应该是正确的。

如果您需要定义更具体的内容,请发布struct fann

的定义