1

我正在尝试使用 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 神经网络)调用 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

我的问题是我找不到 struct FANN_API 应该是什么。fann.h 的第 130 行指出,仅#define FANN_API此而已,没有定义或任何内容。

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

谢谢!

4

1 回答 1

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.

于 2012-06-18T03:07:20.140 回答