2009-08-18 24 views
10

私はいくつかの音楽プレーヤーとの統合に取り組んでいます。現時点では、私のお気に入りはエクサイクです。Cからpython pickleデータベース/ファイルを読むにはどうすればよいですか?

新しいバージョンでは、データベース形式をSQLite3から内部ピクル形式に移行しています。手作業でフォーマットをリバースエンジニアリングすることなく、pickleフォーマットファイルにアクセスする方法があるかどうかを知りたかったのです。

私ははcPickleのPythonモジュールがあるけど、私はそれがC.

+0

は、移植性は、アプリケーションにとって非常に重要なのですか? –

+0

exaileは私が知る限りLinux上でしか動かないので、実際はありません。 –

答えて

17

http://www.picklingtools.com/

ライブラリがありますが、私が有用であるかもしれない維持を助けるPicklingToolsと呼ばれる:それはC++ではなくC、である...あなたは、その後化したりunpickle化したり/ pickle化できることをあなたがC++でデータ構造を形成することができます最近は問題にならないはずです(gcc/g ++スイートを使用していると仮定して)。

ライブラリはプレーンなC++ライブラリです(C++とPythonの例では、C++とPythonの両方のソケットとファイルにライブラリを使用する方法を示しています)。しかし、一般的にファイルへのpicklingの基本は利用可能です。

基本的な考え方は、PicklingToolsライブラリがC++の "python-like"データ構造を提供し、Python/C++への直列化と逆シリアル化ができることです。 int、long int、string、None、complex、dictionarys、lists、ordered dictionary、tuplesのすべての(?)基本型がサポートされています。カスタムクラスを行うフックはほとんどありませんが、その部分は未熟です。ライブラリの残りの部分はかなり安定しており、8年間有効です。

簡単な例:

#include "chooseser.h" 
int main() 
{ 
    Val a_dict = Tab("{ 'a':1, 'b':[1,2.2,'three'], 'c':None }"); 
    cout << a_dict["b"][0]; // value of 1 

    // Dump to a file 
    DumpValToFile(a_dict, "example.p0", SERIALIZE_P0); 

    // .. from Python, can load the dictionary with pickle.load(file('example.p0')) 

    // Get the result back 
    Val result; 
    LoadValFromFile(result, "example.p0", SERIALIZE_P0); 
    cout << result << endl; 
} 

ウェブサイト上で詳細なドキュメント(FAQおよびユーザーズ・ガイド)があります。これは便利です

希望:

Gooday、

リッチー

http://www.picklingtools.com/

+1

これは素晴らしですが、ライブラリがPythonのpickleモジュールで以前に保存されたファイルを開くことができる場合、またはカスタムpicklingtoolsのpython picklerを使用する必要がある場合は、ここ(またはWebサイト)で明白ではありません。 –

+0

データが標準データ型(int、long、dict、list、stringなど)で、クラスではない限り、正常に動作するはずです。 (すなわち、Pythonから抜いたものは、上記の手法を使ってC++から読み込むことができるはずです)。あなたのデータにクラスが含まれている場合、それを動作させることができます:すべてのPythonクラスがdictsとして名前空間を実装することを思い出してください。そうすればクラスから__dict__を取得し、 – rts1

1

から直接呼び出し可能である場合は、CプログラムでPythonインタプリタを埋め込むことができます気付いていないが、私は最も簡単な解決策を書くことだと思い"ピクルス"を別のフォーマットで変換するPythonスクリプト。 SQLiteデータベース

3

クリスティアンは、ここでの例を参照してください、あなたはかなり簡単にあなたのCコードでPythonコードを埋め込むことができ、言いましたように:http://docs.python.org/extending/extending.html#calling-python-functions-from-c

はcPickleを使用するのpythonに簡単にも死んでいるあなたのようなsomehtingを使用できます。

import cPickle 

f = open('dbfile', 'rb') 
db = cPicle.load(f) 
f.close() 
# handle db integration 
f = open('dbfile', 'wb') 
cPickle.dump(db, f) 
f.close() 
+0

私が知る限り、唯一の選択肢は、Pythonインタプリタを埋め込むことです。 win32に移植する必要はないので、これはあまり良い解決策ではありません。 –