2012-03-08 11 views
8

Cで大きな構造体を静的に宣言しましたが、この同じデータをPythonで分析する必要があります。私はむしろエラーを避けるためにこのデータをPythonに再コピーしないでしょう、Pythonでこのデータに直接アクセスする(読み取り専用)方法はありますか?私は「ctypesの」を見て、SWIG、及びそれらのどちらもが私が探しているものを提供するために、思われている....PythonからC-宣言されたネストされた構造体にアクセスする

例えば、私が持っている:

/* .hファイル*/

typedef struct 
{ 
    double data[10]; 
} NestedStruct; 


typedef struct 
{ 
    NestedStruct array[10]; 
} MyStruct; 

/* .cファイル*/

MyStruct the_data_i_want = 
{ 
    {0}, 
    { 
    {1,2,3,4} 
    }, 
    {0}, 
}; 

理想的には、私は私が取得できるようになる何かをしたいと思いますこれをPythonに入れて、the_data_i_want.array[1].data[2]またはこれに類するものを介してアクセスしてください。何かご意見は?私は自分の.cファイルから作成した.soファイルをコンパイル/インポートすることができたという意味で "仕事"をしていましたが、cvarsを使ってそのファイルにアクセスすることはできませんでした。多分別の方法がありますか?これは難しいはずがないようです...。


実際に、私はそれを理解しました。私の評判は8時間以内に私自身の質問に答えることができないので、私はこれを追加しています。私は8時間後に覚えておく必要がないので今すぐ追加します。私は理解できないほどの理由があると確信しています。

それを実演しました。私は図書館に私の.cファイルをコンパイルした第一

:次に

が、私はデータ開催するPythonのクラスを定義するタイプを使用しました。そして、

from ctypes import * 

class NestedStruct(Structure): 
    _fields_ = [("data", c_double*10)] 

class MyStruct(Structure): 
    _fields_ = [("array", NestedStruct*10)] 

を、私はに共有ライブラリをロードパイソン:

my_lib = cdll.LoadLibrary("my_lib.so") 

はその後、私はデータを取得するには、 "in_dll" メソッドを使用:

それは私の実際のデータ構造は3つのレベルにネストされているので、私は少しここに構文を台無しにしていることと、私はここで説明のために簡略化したかった

C. the_data_i_want.array[1].data[2]注であるかのように

その後、私はそれをアクセスすることができました。

+0

SWIGについては、http://stackoverflow.com/q/8114030/168175 – Flexo

+2

に興味があるかもしれません。今度は、ソリューションを実際の回答に移行し、それを受け入れるのはいい時期です。 – augurar

答えて

1

また、Cでデータを読み込んでJSONファイルに書き込んだら、簡単に解析することもできます(通常はそれを行うライブラリもあります; python import json)ほぼすべての言語設定が可能です。同時に、元のCコードでアクセスしたのと似たようなデータにアクセスすることができます。

ちょうど提案として。これにより、データの移植性と汎用性が向上すると思いますが、CコードをPythonに直接読み込んだ場合と同じように、JSONの記述と解析に多くの時間を費やします。

関連する問題