我正在尝试使用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: 11
或AttributeError: '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代码中声明的格式?如果没有,那么任何人都可以建议我可能需要做什么/阅读什么来让我的代码工作?
谢谢!
答案 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
。