Как я могу прочитать базу данных/файл пиренейского пика из C?

Я работаю над интеграцией с несколькими музыкальными проигрывателями. В настоящий момент мой фаворит exaile.

В новой версии они переносят формат базы данных из SQLite3 во внутренний формат Pickle. Я хотел знать, есть ли способ получить доступ к файлам формата pickle, не перерабатывая формат вручную.

Я знаю, что есть модуль cPickle python, но я не знаю, может ли он быть вызван непосредственно из C.

Ответ 1

http://www.picklingtools.com/

Существует библиотека под названием PicklingTools, которую я поддерживаю, которая может быть полезной: она позволяет вам создавать структуры данных на С++, которые вы затем можете распиливать/разглаживать... это С++, а не C, но это не должно быть проблемой в эти дни (предполагая, что вы используете пакет gcc/g++).

Библиотека представляет собой обычную библиотеку С++ (в дистрибутиве есть примеры С++ и Python, показывающие, как использовать библиотеку через сокеты и файлы как из С++, так и из Python), но в целом доступны основы травления в файлах.

Основная идея заключается в том, что библиотека PicklingTools предоставляет вам "python-подобные" структуры данных из С++, чтобы затем сериализовать и десериализовать в/из Python/С++. Поддерживаются все (?) Основные типы: int, long int, string, None, complex, словари, списки, упорядоченные словари и кортежи. Есть несколько крючков для выполнения пользовательских классов, но эта часть немного незрелая: остальная часть библиотеки довольно стабильна и активна в течение 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,

Ричи

http://www.picklingtools.com/

Ответ 2

Как сказал Кристиан, вы можете легко вставить код Python в свой код C, см. пример здесь: http://docs.python.org/extending/extending.html#calling-python-functions-from-c

Использование cPickle также нелегко, а на python вы можете использовать somehting, например:

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

Ответ 3

Вы можете встроить интерпретатор Python в программу на C, но я считаю, что самым простым решением является запись Python script, который преобразует "рассолы" в другой формат, например. база данных SQLite.