2016-03-28 10 views
0

既存の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ソースを変更する必要がないアプローチを探しています。

+0

* "structs [...]には何百ものフィールドがあります" *これは通常、設計上の欠陥の兆候です。配列を使用する方が適切かもしれません。 – user3386109

+0

可能かもしれませんが、私のコードではありませんので、可能であれば非侵襲的な方法でラップしようとしています。 – gariepy

+0

@ user3386109:このような 'structs'は非常にうまくいきます。しかし、それらはまれであり、新しいコードのために、継承を伴ういくつかのOOPアプローチがしばしば優れています。 – Olaf

答えて

0

Cythonのアプローチは、.hヘッダーファイルを読み込んで解釈することです。 しかし、それは簡単だろうとは言いません。