2009-08-18 6 views
10

Je travaille sur l'intégration avec plusieurs lecteurs de musique. En ce moment mon préféré est exaile.Comment puis-je lire une base de données/fichier python pickle de C?

Dans la nouvelle version, ils migrent le format de base de données SQLite3 vers un format Pickle interne. Je voulais savoir s'il y avait un moyen d'accéder aux fichiers au format pickle sans avoir à faire de l'ingénierie inverse du format à la main.

Je sais qu'il ya le module python cPickle, mais je ne suis pas au courant si elle est appelable directement de C.

+0

est portabilité très important pour votre application? –

+0

Pas vraiment, puisque exaile ne fonctionne que sur linux autant que je sache. –

Répondre

17

http://www.picklingtools.com/

il y a une bibliothèque appelée les PicklingTools que j'aider à maintenir ce qui pourrait être utile: il vous permet de former des structures de données en C++ que vous pouvez alors cornichon/unpickle ... il est C++, pas C, mais cela ne devrait pas poser de problème ces derniers temps (en supposant que vous utilisez la suite gcc/g ++). La bibliothèque est une bibliothèque C++ simple (il existe des exemples de C++ et Python dans la distribution montrant comment utiliser la bibliothèque sur des sockets et des fichiers de C++ et Python), mais en général, les bases du décapage vers les fichiers sont disponible.

L'idée de base est que la bibliothèque PicklingTools vous donne des structures de données "python-like" à partir de C++ afin que vous puissiez ensuite sérialiser et désérialiser Python/C++. Tous (?) Les types de base: int, long int, chaîne, None, complexe, dictionnaire, listes, dictionnaires ordonnés et tuples sont supportés. Il y a peu de hooks pour faire des classes personnalisées, mais cette partie est un peu immature: le reste de la librairie est assez stable et a été actif pendant 8 (?) Ans.

Exemple simple:

#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; 
} 

Il y a d'autres documents (FAQ Guide de l'utilisateur) sur le site Web.

Espérons que cela est utile:

Gooday,

Richie

http://www.picklingtools.com/

+1

Cela semble très bien, mais il n'est pas clair ici (ou sur le site Web) si la bibliothèque peut ouvrir des fichiers qui ont été préalablement enregistrés avec le module pickle de python - ou si un sélecteur python picklingtools personnalisé doit être utilisé. –

+0

Tant que vos données sont dans les types de données standard (int, long, dict, liste, chaîne, etc), et non une classe, cela devrait fonctionner correctement. (C'est à dire., quelque chose décacheté de Python devrait pouvoir lire du C++ en utilisant les techniques ci-dessus). Si vos données contiennent une classe, vous pourrez peut-être la faire fonctionner: rappelez-vous que toutes les classes Python implémentent leurs espaces de noms en tant que dicts, donc vous pouvez obtenir le __dict__ d'une classe et le décaper! – rts1

1

Vous pouvez intégrer un interpréteur Python dans un programme C, mais je pense que la meilleure solution est d'écrire un script Python qui convertit les "pickles" dans un autre format, par exemple une base de données SQLite.

3

Comme Cristian dit, vous pouvez assez facilement intégrer le code python dans votre code C, voir l'exemple ici: http://docs.python.org/extending/extending.html#calling-python-functions-from-c

Utilisation cPickle est mort facile aussi bien sur python vous pouvez utiliser somehting comme:

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

autant que je sache et pour autant que l'on me dise que la seule option est d'intégrer un interpréteur python. Comme je n'aurai pas besoin de le porter sur win32, ce n'est pas une si mauvaise solution. –

Questions connexes