2009-08-18 75 views
10

我正在與幾個音樂播放器進行整合。目前我最喜歡的是exaile。如何從C讀取python pickle數據庫/文件?

在新版本中,他們將數據庫格式從SQLite3遷移到內部Pickle格式。我想知道是否有辦法訪問pickle格式文件,而無需手動反向設計格式。

我知道存在的cPickle Python模塊,但我不知道,如果它是可調用直接從C.

+0

是移植到你的應用程序很重要嗎? – 2009-08-18 20:37:57

+0

不是真的,因爲exaile只能在Linux上運行,據我所知。 – 2009-08-18 21:25:07

回答

17

http://www.picklingtools.com/

有一種庫調用我幫助維持這可能是有用的PicklingTools:它可以讓你形成C++數據結構,然後可以泡菜/ unpickle ...這是C++,不C,但這些日子不應該是一個問題(假設你使用的是gcc/g ++套件)。

該庫是一個普通的C++庫(在分佈中有C++和Python示例,展示瞭如何在來自C++和Python的套接字和文件上使用該庫),但通常,酸洗文件的基礎是可用。

其基本思想是PicklingTools庫爲您提供了來自C++的「python-like」數據結構,以便您可以序列化和反序列化到Python/C++。所有(?)基本類型:支持int,long int,string,None,complex,dictionarys,lists,ordered dictionaries和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; 
} 

沒有在網站上更多的文件(常見問題解答和用戶指南)。

希望這是有用的:

Gooday,

裏奇

http://www.picklingtools.com/

+1

這看起來不錯,但是在這裏(或者在網站上),如果庫可以打開以前用python的pickle模塊保存的文件,或者需要使用自定義picklingtools python pickler,這裏就不清楚了。 – 2014-10-29 11:45:41

+0

只要你的數據是標準數據類型(int,long,dict,list,string等),而不是一個類,它應該工作得很好。 (即,從Python醃製的東西應該能夠使用上述技術從C++讀取)。如果你的數據確實包含了一個類,你可能可以使它工作:回想一下,所有的Python類都將它們的命名空間實現爲字典,所以你可以從類中獲得__dict__並且使其成爲可能! – rts1 2015-03-13 18:11:04

1

您可以嵌入在C程序的Python解釋器,但我認爲,最簡單的解決辦法就是寫以另一種格式轉換「pickles」的Python腳本,例如一個SQLite數據庫。

3

像克里斯蒂安說,你可以比較容易地嵌入Python代碼在你的C代碼,在這裏看到的例子:http://docs.python.org/extending/extending.html#calling-python-functions-from-c

使用cPickle的死很容易,以及在Python中,你可以使用服用點,如:

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,所以這不是一個很糟糕的解決方案。 – 2009-08-19 09:23:59