2009-08-18 20 views
10

Estoy trabajando en la integración con varios reproductores de música. Por el momento mi favorito es exaile.¿Cómo puedo leer una base de datos/archivo de Python Pickle desde C?

En la nueva versión están migrando el formato de base de datos de SQLite3 a un formato interno de Pickle. Quería saber si hay una forma de acceder a los archivos en formato de encuadre sin tener que realizar una ingeniería inversa del formato a mano.

Sé que es el módulo cPickle pitón, pero no tengo conocimiento si es exigible directamente de C.

+0

es la portabilidad muy importante para su aplicación? –

+0

En realidad no, ya que exaile solo funciona en Linux por lo que yo sé. –

Respuesta

17

http://www.picklingtools.com/

hay una biblioteca llamados los PicklingTools la que me ayudan a mantener lo que podría ser útil: permite formar estructuras de datos en C++ que pueda luego salmuera/unpickle ... es C++, no C, pero eso no debería ser un problema en estos días (suponiendo que esté utilizando el conjunto de gcc/g ++).

La biblioteca es una biblioteca simple de C++ (hay ejemplos de C++ y Python dentro de la distribución que muestra cómo usar la biblioteca sobre sockets y archivos de C++ y Python), pero en general, lo básico disponible.

La idea básica es que la biblioteca PicklingTools le brinda estructuras de datos "tipo pitón" de C++ para que luego pueda serializar y deserializar hacia/desde Python/C++. Todos (?) Los tipos básicos: int, long int, string, None, complex, dictionarys, listas, diccionarios ordenados y tuplas son compatibles. Hay pocos ganchos para hacer clases personalizadas, pero esa parte es un poco inmadura: el resto de la biblioteca es bastante estable y ha estado activo durante 8 (?) Años.

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

Existe documentación adicional (FAQ y Guía del usuario) en el sitio web.

Hope esto es útil:

Gooday,

Richie

http://www.picklingtools.com/

+1

Esto se ve muy bien, pero no está claro aquí (o en el sitio web) si la biblioteca puede abrir archivos que se han guardado previamente con el módulo pickle de python, o si se necesita usar un Pickling Pickling Pitón personalizado. –

+0

Siempre que sus datos estén en los tipos de datos estándar (int, long, dict, list, string, etc.), y no en una clase, deberían funcionar bien. (Es decir., algo en escabeche de Python debería ser capaz de leer desde C++ utilizando las técnicas anteriores). Si sus datos contienen una clase, puede hacer que funcione: recuerde que todas las clases de Python implementan sus espacios de nombres como dicts, para que pueda obtener el __dict__ de una clase y salte eso! – rts1

1

Puede incrustar un intérprete de Python en un programa en C, pero creo que la solución más fácil es escribir un script de Python que convierte "pickles" en otro formato, por ejemplo una base de datos SQLite.

3

Al igual que Cristian dijo, que más bien puede integrar fácilmente el código Python en el código C, véase el ejemplo aquí: http://docs.python.org/extending/extending.html#calling-python-functions-from-c

Uso cPickle está muerto fácil, así de pitón podría utilizar somehting como:

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

por lo que puedo decir y, por lo que me han dicho, la única opción es insertar un intérprete de Python. Como no necesitaré portarlo a win32, esta no es una solución tan mala. –

Cuestiones relacionadas