2016-05-18 8 views
0

どのように入れ子になった辞書にPythonから(scipy.weaveを通して)Cへ渡すことができますか?Cで入れ子になったPython辞書を抽出する

私は、PythonコードとCコードのインターフェイスが必要な複雑なコードを開発しています。 dict_1,dict_2,...のような辞書自身、ある

nested_dict = {'key1': dict_1, 'key2': dict_2, ...} 

:Pythonは/ scipy.weaveコードは次のように、ネストされた辞書のインターフェースCに渡す

dict_1 = {'kd1': val1, ...} 

私はdict_1kd1val1にアクセスしたいと言います。 2行目の

void myfunc(PyObject* nested_dict){ 
    PyObject* dict1 = PyDict_GetItemString(nested_dict,"key1"); 
    double val1 = PyFloat_AS_DOUBLE(PyDict_GetItemString(dict1,"kd1")); 
} 

残念ながら、この悲惨クラッシュ:scipy.weaveコードは、C関数myfunc(PyObject* nested_dict)呼び出します。そして、なぜ私は理解できません。

ご協力いただければ幸いです。

乾杯、 マウリツィオ

+0

エラーチェックはどこですか? –

+0

良い点。私はもう少しエラーチェックをしました。私は間違ったデータ構造を渡していました。上記のコードは正しいです。 – maurizio

+0

それにもかかわらず、コードにエラーチェックを追加する必要があります(たとえば、戻り値がNULLの場合はすぐに戻ります)。おかげさまで –

答えて

0

私が渡した、ネストされた辞書は、キーkey1を持っていなかったので、それがクラッシュしていました。コメントでIgnacioが提案した簡単なエラーチェック。すなわち、

PyObject * dict_1 = PyDict_GetItemString(nested_dict,"key1"); 
if(dict_1==NULL){ 
    fprintf(stderr, "key1 is not a dictionary key\n"); 
    exit(-1); 
} 

バグの特定に役立ちました。それ以外の場合は、上記のコードがその目的を果たします。

+0

'exit(-1);'は実際にやってはいけないことではありません(印刷する必要はありませんが、それは別の問題です)。 APIによって設定された例外が呼び出し側にスローされるように関連するクリーンアップを実行した後で、 'NULLを返す '必要があります。 –

関連する問題