我正在與幾個音樂播放器進行整合。目前我最喜歡的是exaile。如何從C讀取python pickle數據庫/文件?
在新版本中,他們將數據庫格式從SQLite3遷移到內部Pickle格式。我想知道是否有辦法訪問pickle格式文件,而無需手動反向設計格式。
我知道存在的cPickle Python模塊,但我不知道,如果它是可調用直接從C.
我正在與幾個音樂播放器進行整合。目前我最喜歡的是exaile。如何從C讀取python pickle數據庫/文件?
在新版本中,他們將數據庫格式從SQLite3遷移到內部Pickle格式。我想知道是否有辦法訪問pickle格式文件,而無需手動反向設計格式。
我知道存在的cPickle Python模塊,但我不知道,如果它是可調用直接從C.
有一種庫調用我幫助維持這可能是有用的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,
裏奇
這看起來不錯,但是在這裏(或者在網站上),如果庫可以打開以前用python的pickle模塊保存的文件,或者需要使用自定義picklingtools python pickler,這裏就不清楚了。 – 2014-10-29 11:45:41
只要你的數據是標準數據類型(int,long,dict,list,string等),而不是一個類,它應該工作得很好。 (即,從Python醃製的東西應該能夠使用上述技術從C++讀取)。如果你的數據確實包含了一個類,你可能可以使它工作:回想一下,所有的Python類都將它們的命名空間實現爲字典,所以你可以從類中獲得__dict__並且使其成爲可能! – rts1 2015-03-13 18:11:04
您可以嵌入在C程序的Python解釋器,但我認爲,最簡單的解決辦法就是寫以另一種格式轉換「pickles」的Python腳本,例如一個SQLite數據庫。
像克里斯蒂安說,你可以比較容易地嵌入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()
據我所知,據我所知,唯一的選擇是嵌入python解釋器。由於我不需要將它移植到win32,所以這不是一個很糟糕的解決方案。 – 2009-08-19 09:23:59
是移植到你的應用程序很重要嗎? – 2009-08-18 20:37:57
不是真的,因爲exaile只能在Linux上運行,據我所知。 – 2009-08-18 21:25:07