既存のCソースコードプロジェクトの.soライブラリラッパーを作成し、Pythonから.soライブラリの関数を呼び出しようとしています。私は基本的な引数と戻り値の型を持つ関数を問題なく呼び出すことができたので、構造体へのポインタである引数を持つより複雑な関数とのインタフェースに取り組んでいます。Pythonの.soファイルから構造体を取得する
私の問題は、私がCライブラリ関数を呼び出すことができるように、Python側で構造を作成することです。 .soライブラリの構造体の中には何百ものフィールドがあるので、Pythonのctypes Structure
オブジェクトのすべてのフィールドと型のスペルを簡単にすることができます。私はこのような何かを書くことができるようにしたいと思い
は、Pythonで:
from ctypes import *
lib = cdll.LoadLibrary("./libexample.so")
class Input(Structure):
_fields_ = lib.example_struct._fields ## where `example_struct` is defined in the .so library
## I have no idea if you can actually get the fields of the struct!!
my_input = Input(a,b,c,...) ## pseudo-code
my_ptr = pointer(my_input) ## wrap the input with a pointer
result = lib.my_lib_func(my_ptr) ## call .so function with struct
これは私は簡単に長いのPythonを作成し、維持することなく、大規模なCの構造体の少なくとも構造定義を複製できるようになります構造体定義のバージョン。これは可能ですか?あるいは、同じ効果を達成する別の方法がありますか?
EDIT:Cソースコードはサードパーティーなので、今はCソースを変更する必要がないアプローチを探しています。
* "structs [...]には何百ものフィールドがあります" *これは通常、設計上の欠陥の兆候です。配列を使用する方が適切かもしれません。 – user3386109
可能かもしれませんが、私のコードではありませんので、可能であれば非侵襲的な方法でラップしようとしています。 – gariepy
@ user3386109:このような 'structs'は非常にうまくいきます。しかし、それらはまれであり、新しいコードのために、継承を伴ういくつかのOOPアプローチがしばしば優れています。 – Olaf