Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C中读取python pickle数据库/文件?_Python_C - Fatal编程技术网

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

如何从C中读取python pickle数据库/文件?,python,c,Python,C,我正在与几个音乐播放器集成。目前我最喜欢的是埃塞尔 在新版本中,他们正在将数据库格式从SQLite3迁移到内部Pickle格式。我想知道是否有一种方法可以访问pickle格式的文件,而不必手动对格式进行反向工程 我知道有cPickle python模块,但我不知道它是否可以直接从C调用。您可以在C程序中嵌入python解释器,但我认为最简单的解决方案是编写一个python脚本,将“pickle”转换为另一种格式,例如SQLite数据库。就像克里斯蒂安所说的,您可以很容易地将python代码嵌入到

我正在与几个音乐播放器集成。目前我最喜欢的是埃塞尔

在新版本中,他们正在将数据库格式从SQLite3迁移到内部Pickle格式。我想知道是否有一种方法可以访问pickle格式的文件,而不必手动对格式进行反向工程


我知道有cPickle python模块,但我不知道它是否可以直接从C调用。

您可以在C程序中嵌入python解释器,但我认为最简单的解决方案是编写一个python脚本,将“pickle”转换为另一种格式,例如SQLite数据库。

就像克里斯蒂安所说的,您可以很容易地将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()

有一个叫做PcCurgToover的库,我帮助它维护它可能有用:它允许你在C++中形成数据结构,然后你就可以泡菜……它是C++,不是C,但这不应该是一个问题,这些天(假设你使用的GCC / G+套件)。p> 库是一个普通的C++库(在C++中有一些C++和python的例子,展示了如何在Socket和C++Python文件上使用库),但是一般来说,对文件进行酸洗的基础是可用的。

基本思想是,Cpk灵器库提供了来自C++的“Python”数据结构,这样您就可以序列化和反序列化到/来自Python /C++。支持所有基本类型:int、long int、string、None、complex、dictionary、list、ordered dictionary和tuple。很少有钩子来定制类,但这一部分有点不成熟:库的其余部分相当稳定,已经活跃了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;
}
#包括“chooseser.h”
int main()
{
Val a_dict=Tab(“{'a':1,'b':[1,2.2,'three'],'c':None}”);

可移植性对您的应用程序非常重要吗?不太重要,因为据我所知,Exail只在linux上运行。据我所知,而且据我所知,唯一的选择是嵌入python解释器。由于我不需要将其移植到win32,这不是一个糟糕的解决方案。这看起来很好,但在这里(或网站上)还不清楚如果库可以打开以前使用python的pickle模块保存的文件,或者如果需要使用自定义picklingtools python pickler。只要您的数据是标准数据类型(int、long、dict、list、string等),而不是类,它就可以正常工作。(即,从Python中提取的东西应该能够使用上面的技术从C++读取)。如果数据包含一个类,则可以使它工作:请记住所有Python类都将其命名空间实现为DITS,这样您就可以从类中获取DICT,并且可以在VisualStudio中安装PkurgToots。