2009-08-18 9 views
10

मैं कई संगीत खिलाड़ियों के साथ एकीकृत करने पर काम कर रहा हूं। फिलहाल मेरा पसंदीदा exaile है।मैं सी से एक अजगर अचार डेटाबेस/फ़ाइल कैसे पढ़ सकता हूं?

नए संस्करण में वे SQLite3 से डेटाबेस स्वरूप को आंतरिक पिकल प्रारूप में माइग्रेट कर रहे हैं। मैं जानना चाहता था कि हाथ से प्रारूप इंजीनियर को रिवर्स किए बिना अचार प्रारूप फ़ाइलों तक पहुंचने का कोई तरीका है या नहीं।

मैं जानता हूँ कि cPickle अजगर मॉड्यूल है, लेकिन मैं अनजान हूँ अगर यह सी

से सीधे प्रतिदेय है
+0

पोर्टेबिलिटी आपके आवेदन के लिए बहुत महत्वपूर्ण है? –

+0

वास्तव में नहीं, क्योंकि exaile केवल लिनक्स पर चलता है जहां तक ​​मुझे पता है। –

उत्तर

17

http://www.picklingtools.com/

वहाँ एक पुस्तकालय PicklingTools जो मैं मदद को बनाए रखने में उपयोगी हो सकता है जो कहा जाता है लेकिन इन दिनों कोई समस्या नहीं होनी चाहिए (मान लीजिए कि आप जीसीसी/जी ++ सूट का उपयोग कर रहे हैं)।

लाइब्रेरी एक सादा सी ++ लाइब्रेरी है (वितरण के भीतर सी ++ और पायथन का उदाहरण दिखाता है कि सॉकेट और लाइब्रेरी दोनों से फ़ाइलों को लाइब्रेरी का उपयोग कैसे करें), लेकिन सामान्य रूप से, फाइलों को पिकलिंग की मूल बातें हैं उपलब्ध।

मूल विचार यह है कि पिकलिंगटूल लाइब्रेरी आपको सी ++ से "पायथन जैसी" डेटा संरचनाएं देती है ताकि आप पाइथन/सी ++ से/से क्रमबद्ध और deserialize कर सकें। सभी (?) मूल प्रकार: int, long int, स्ट्रिंग, कोई नहीं, जटिल, शब्दकोश, सूचियां, आदेशित शब्दकोश और टुपल्स समर्थित हैं। कस्टम कक्षाएं करने के लिए कुछ हुक हैं, लेकिन वह हिस्सा थोड़ा अपरिपक्व है: बाकी पुस्तकालय बहुत स्थिर है और 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; 
} 

वहाँ आगे प्रलेखन (पूछे जाने वाले प्रश्न और उपयोगकर्ता की गाइड) वेब साइट पर है।

आशा इस उपयोगी है:

GOODAY,

रिची

http://www.picklingtools.com/

+1

यह बहुत अच्छा लग रहा है, लेकिन यह यहां स्पष्ट नहीं है (या वेबसाइट पर) यदि पुस्तकालय उन फ़ाइलों को खोल सकता है जो पहले पाइथन के अचार मॉड्यूल से सहेजे गए हैं - या यदि एक कस्टम पिकलिंगटॉल्स पायथन पिकलर का उपयोग करने की आवश्यकता है। –

+0

जब तक आपका डेटा मानक डेटा प्रकारों (int, long, dict, list, string, आदि) में होता है, और कक्षा नहीं, तो यह ठीक काम करना चाहिए। (अर्थात।, पाइथन से कुछ मसाला ऊपर की तकनीक का उपयोग कर सी ++ से पढ़ने में सक्षम होना चाहिए)। यदि आपके डेटा में कक्षा है, तो आप इसे काम करने में सक्षम हो सकते हैं: याद रखें कि सभी पायथन कक्षाएं उनके नामस्थान को डिक्ट्स के रूप में लागू करती हैं, ताकि आप कक्षा से __dict__ प्राप्त कर सकें और उस अचार को प्राप्त कर सकें! – rts1

1

आप एक सी कार्यक्रम में एक अजगर दुभाषिया एम्बेड कर सकते हैं, लेकिन मुझे लगता है कि सबसे आसान समाधान लिखना है एक पायथन लिपि जो किसी अन्य प्रारूप में "अचार" को परिवर्तित करती है, उदाहरण के लिए एक SQLite डेटाबेस।

3

तरह क्रिस्टियन कहा, यदि आप इसके बजाय आसानी से अपने सी कोड में अजगर कोड एम्बेड कर सकते हैं, उदाहरण के यहाँ देखें: http://docs.python.org/extending/extending.html#calling-python-functions-from-c

का उपयोग cPickle अजगर पर आसान रूप में अच्छी तरह मर चुका है आप की तरह 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() 
कि आप कर सकते हैं तो अचार/unpickle ... यह सी ++, नहीं सी है, यह आप सी में डेटा संरचनाओं ++ बनाने के लिए अनुमति देता है:
+0

जहां तक ​​मैं कह सकता हूं और जहां तक ​​मुझे बताया गया है कि एकमात्र विकल्प एक पायथन दुभाषिया को एम्बेड करना है। चूंकि मुझे इसे Win32 पर बंद करने की आवश्यकता नहीं होगी, इसलिए यह इतना बुरा समाधान नहीं है। –

संबंधित मुद्दे