如何从C中读取Python pickle数据库/文件?

25 投票
3 回答
33138 浏览
提问于 2025-04-15 13:41

我正在和几个音乐播放器进行整合。目前我最喜欢的是exaile。

在新版本中,他们正在把数据库格式从SQLite3迁移到一种内部的Pickle格式。我想知道有没有办法直接访问Pickle格式的文件,而不需要手动去研究这个格式。

我知道有一个叫cPickle的Python模块,但我不太清楚它是否可以直接从C语言调用。

3 个回答

3

你可以在C程序里嵌入一个Python解释器,但我觉得最简单的办法是写一个Python脚本,把“pickles”转换成其他格式,比如SQLite数据库。

5

正如Cristian所说,你可以很简单地把Python代码嵌入到你的C代码中,具体的例子可以在这里找到。

在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()
33

有一个叫做PicklingTools的库,我在维护这个库,可能对你有帮助:它可以让你在C++中创建数据结构,然后进行序列化和反序列化……它是C++的,不是C,不过现在用C++应该没什么问题(假设你在用gcc/g++工具)。

这个库是一个普通的C++库(里面有C++和Python的示例,展示了如何通过套接字和文件在C++和Python之间使用这个库),但总的来说,基本的将数据保存到文件的功能是可以用的。

简单来说,PicklingTools库让你在C++中使用类似Python的数据结构,这样你就可以在Python和C++之间进行数据的序列化和反序列化。所有基本的数据类型:整数、长整数、字符串、空值、复数、字典、列表、有序字典和元组都支持。虽然有一些可以用来处理自定义类的功能,但那部分还不太成熟:库的其他部分相对稳定,已经活跃了大约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;
}

网站上还有更多文档(常见问题和用户指南)。

希望这对你有帮助:

祝好,

Richie

http://www.picklingtools.com/

撰写回答