1

python3でctypesを使用して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: 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コードで宣言するためのフォーマットをどのように見つけることができますか?そうでない場合、誰かが私のコードを機能させるために私が何をする必要があるか/何を読む必要があるかを提案できますか?

ありがとう!

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 に答える