2009-08-18 17 views
10

Tôi đang làm việc để tích hợp với một số trình phát nhạc. Tại thời điểm tôi yêu thích là exaile.Làm thế nào tôi có thể đọc một cơ sở dữ liệu trâu/tệp trăn từ C?

Trong phiên bản mới, họ đang di chuyển định dạng cơ sở dữ liệu từ SQLite3 sang định dạng Pickle nội bộ. Tôi muốn biết nếu có một cách để truy cập các tập tin định dạng dưa chuột mà không cần phải đảo ngược kỹ sư định dạng bằng tay.

Tôi biết có là module cPickle trăn, nhưng tôi không biết nếu nó là callable trực tiếp từ C.

+0

là tính di động rất quan trọng để ứng dụng của bạn? –

+0

Không thực sự, vì exaile chỉ chạy trên Linux như xa như tôi biết. –

Trả lời

17

http://www.picklingtools.com/

có một thư viện gọi là PicklingTools mà tôi giúp duy trì mà có thể có ích: nó cho phép bạn tạo ra các cấu trúc dữ liệu trong C++ mà bạn có thể sau đó dưa/unpickle ... nó là C++, không phải C, nhưng đó không phải là một vấn đề những ngày này (giả sử bạn đang sử dụng bộ gcc/g ++).

Thư viện là thư viện C++ đơn giản (có các ví dụ về C++ và Python trong phân phối cho biết cách sử dụng thư viện trên ổ cắm và tệp từ cả C++ và Python), nhưng nói chung, có sẵn.

Ý tưởng cơ bản là thư viện PicklingTools cung cấp cho bạn cấu trúc dữ liệu "giống python" từ C++ để sau đó bạn có thể tuần tự hóa và deserialize thành/từ Python/C++. Tất cả (?) Các kiểu cơ bản: int, long int, string, None, complex, dictionarys, lists, từ điển và bộ dữ liệu được đặt hàng đều được hỗ trợ. Có rất ít móc để làm các lớp tùy chỉnh, nhưng phần đó là một chút chưa trưởng thành: phần còn lại của thư viện khá ổn định và đã hoạt động trong 8 (?) Năm.

đơn giản ví dụ:

#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; 
} 

Có tài liệu hướng dẫn thêm (FAQ và Hướng dẫn sử dụng) trên trang web.

Hy vọng điều này rất hữu ích:

Gooday,

Richie

http://www.picklingtools.com/

+1

Điều này có vẻ tuyệt vời, nhưng không rõ ràng ở đây (hoặc trên trang web) nếu thư viện có thể mở các tệp đã được lưu trước đó với mô-đun dưa của python - hoặc nếu sử dụng trình chọn picklingtools python. –

+0

Miễn là dữ liệu của bạn nằm trong các kiểu dữ liệu chuẩn (int, long, dict, list, string, vv), và không phải là một lớp, nó sẽ hoạt động tốt. (I E., một cái gì đó ngâm từ Python sẽ có thể đọc từ C++ bằng cách sử dụng các kỹ thuật ở trên). Nếu dữ liệu của bạn có chứa một lớp, bạn có thể làm cho nó hoạt động: nhớ lại rằng tất cả các lớp Python thực hiện không gian tên của chúng như là các dicts, vì vậy bạn có thể lấy __dict__ từ một lớp và chọn nó! – rts1

1

Bạn có thể nhúng một thông dịch Python trong một chương trình C, nhưng tôi nghĩ rằng giải pháp đơn giản nhất là để viết một tập lệnh Python chuyển đổi "dưa chua" ở định dạng khác, ví dụ một cơ sở dữ liệu SQLite.

3

Giống như Cristian nói, bạn có thể khá dễ dàng nhúng mã python trong mã C bạn, hãy xem ví dụ ở đây: http://docs.python.org/extending/extending.html#calling-python-functions-from-c

Sử dụng cPickle là chết dễ dàng như tốt trên python bạn có thể sử dụng somehting như:

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

theo như tôi có thể nói và như xa như tôi đã được nói với tùy chọn duy nhất là nhúng một trình thông dịch python. Vì tôi sẽ không cần phải chuyển nó đến win32, đây không phải là một giải pháp tồi. –

Các vấn đề liên quan