2009-08-18 11 views
10

Pracuję nad integracją z kilkoma odtwarzaczami muzycznymi. W tej chwili mój ulubiony jest exaile.Jak mogę odczytać bazę danych/plik Pythona z C?

W nowej wersji migrują format bazy danych z SQLite3 do wewnętrznego formatu pikle. Chciałem wiedzieć, czy istnieje sposób na uzyskanie dostępu do plików w formacie pikla bez konieczności ręcznej inżynierii wstecznej.

wiem, że to moduł cPickle python, ale jestem świadoma, jeśli jest wpłacone bezpośrednio z C

+0

Czy przenośność bardzo ważne dla aplikacji? –

+0

Niezupełnie, ponieważ exaile działa tylko na Linuksie, o ile wiem. –

Odpowiedz

17

http://www.picklingtools.com/

jest biblioteka o nazwie PicklingTools które pomogą utrzymać które mogą być użyteczne: to pozwala tworzyć struktury danych w języku C++, które można następnie zalewa/unpickle ... to jest C++, a nie C, ale to nie powinno być problemem w dzisiejszych czasach (zakładając, że używasz pakietu gcc/g ++).

Biblioteka jest zwykłą biblioteką C++ (istnieją przykłady C++ i Python w dystrybucji pokazujące, jak korzystać z biblioteki poprzez gniazda i pliki zarówno z C++, jak i Pythona), ale ogólnie rzecz biorąc, podstawą trawienia plików jest dostępny.

Podstawową ideą jest to, że biblioteka PicklingTools zapewnia "podobne do Pythona" struktury danych z C++, dzięki czemu można serializować i deserializować do/z Python/C++. Wszystkie (?) Podstawowe typy: int, long int, string, None, complex, dictionarys, lists, słowniki uporządkowane i krotki są obsługiwane. Jest kilka haczyków do wykonywania klas niestandardowych, ale ta część jest nieco niedojrzała: reszta biblioteki jest dość stabilna i była aktywna przez 8 (?) Lat.

Prosty przykład:

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

Istnieje również dokumentacja (FAQ i Podręcznik użytkownika) na stronie internetowej.

Nadzieja jest to przydatne:

Gooday,

Richie

http://www.picklingtools.com/

+1

To wygląda świetnie, ale nie jest tu jasne (lub na stronie internetowej), czy biblioteka może otwierać pliki, które zostały wcześniej zapisane z modułem Pythona - lub czy należy użyć niestandardowego picklingtools Pythona. –

+0

Dopóki twoje dane są w standardowych typach danych (int, long, dict, list, string, itp.), A nie w klasie, powinno działać dobrze. (To znaczy., coś pobrane z Pythona powinno być w stanie odczytać z C++ przy użyciu powyższych technik). Jeśli twoje dane zawierają klasę, być może uda ci się ją uruchomić: pamiętaj, że wszystkie klasy Pythona implementują swoje przestrzenie nazw jako dyktowane, dzięki czemu możesz uzyskać __dict__ z klasy i zalać to! – rts1

1

można osadzić interpretera Pythona w programie C, ale myślę, że najprostszym rozwiązaniem jest napisanie skrypt Python, który konwertuje "pikle" w innym formacie, np baza danych SQLite.

3

jak Cristian powiedziano, można dość łatwo osadzać kod Pythona w kodzie C, zobacz przykład tutaj: http://docs.python.org/extending/extending.html#calling-python-functions-from-c

Korzystanie cPickle jest martwe proste, jak również na Pythonie można użyć somehting jak:

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

o ile mogę powiedzieć i o ile mi powiedziano, jedyną opcją jest osadzenie interpretera python. Ponieważ nie będę musiał przenosić go na win32, nie jest to takie złe rozwiązanie. –

Powiązane problemy