我正在与几家音乐播放器合作。目前,我最喜欢的是exaile。
在新版本中,他们将数据库格式从SQLite3迁移到内部Pickle格式。我想知道是否有办法访问pickle格式文件而无需手动反向设计格式。
我知道有cPickle python模块,但我不知道它是否可以直接从C调用。
答案 0 :(得分:21)
有一个名为PicklingTools的库,我帮助维护它可能有用:它允许你用C ++形成数据结构然后你可以pickle / unpickle ...它是C ++,而不是C,但是不应该这些天成为一个问题(假设您使用的是gcc / g ++套件)。
该库是一个普通的C ++库(分发中有C ++和Python的例子,展示了如何在C ++和Python的套接字和文件上使用库),但一般来说,可以使用文件的酸洗基础知识。
基本思想是PicklingTools库为您提供了来自C ++的“类似python”的数据结构,以便您可以对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;
}
网站上还有其他文档(FAQ和用户指南)。
希望这很有用:
Gooday,
里奇
答案 1 :(得分:3)
您可以在C程序中嵌入Python解释器,但我认为最简单的解决方案是编写一个Python脚本,以另一种格式转换“泡菜”,例如:一个SQLite数据库。
答案 2 :(得分:3)
像Cristian告诉你的那样,你可以在你的C代码中轻松嵌入python代码,参见示例here。
在python上使用cPickle很容易,你可以使用类似的东西:
import cPickle
f = open('dbfile', 'rb')
db = cPickle.load(f)
f.close()
# handle db integration
f = open('dbfile', 'wb')
cPickle.dump(db, f)
f.close()