2010-06-14 14 views
6

मुझे को PHP में एक डिक्शनरी को deserialize करना है जो Python में cPickle का उपयोग करके क्रमबद्ध किया गया था।PHP से पायथन का सीपीकल deserialization?

इस विशिष्ट मामले में मैं शायद वांछित जानकारी regexp कर सकता था, लेकिन क्या कोई बेहतर तरीका है? PHP के लिए कोई भी एक्सटेंशन जो मुझे पूरे शब्दकोश को अधिक मूल रूप से deserialize करने की अनुमति देगा?

जाहिर है इसे इस तरह अजगर में धारावाहिक है:

import cPickle as pickle 

data = { 'user_id' : 5 } 
pickled = pickle.dumps(data) 
print pickled 

ऐसे क्रमबद्धता की सामग्री, यहाँ करने के लिए आसानी से चिपकाया नहीं जा सकता, क्योंकि यह बाइनरी डेटा है।


समाधान

अजगर अंत के बाद से Django है, मैं own JSON SessionStore बना दी।

+3

आपने बताया कि क्रमबद्धरण आपके नियंत्रण में नहीं है। आप इस मसालेदार डेटा को कैसे प्राप्त कर रहे हैं? एक स्थानीय फाइल? –

+0

यह Django में डेटाबेस से आता है, यह django सत्र तालिका में session_data है। मैं शायद सत्र_डेटा को जेएसओएन के रूप में क्रमबद्ध करने के लिए सत्र मिडलवेयर लिख रहा हूं। मैं बस कामना करता हूं कि मुझे इसके लिए Django ऐप को संशोधित करने की आवश्यकता नहीं है। – Ciantic

उत्तर

7

यदि आप विभिन्न भाषाओं में लिखे गए कार्यक्रमों के बीच डेटा ऑब्जेक्ट्स साझा करना चाहते हैं, तो इसके बजाय JSON जैसे कुछ का उपयोग करके क्रमबद्ध/deserialize करना आसान हो सकता है। अधिकांश प्रमुख प्रोग्रामिंग भाषाओं में एक JSON लाइब्रेरी है।

+2

पायथन 2.6+ ने इसे अंतर्निहित किया है, और पिछले संस्करणों के लिए सरल है। –

+2

हालांकि एक अच्छा विचार है, serialization हिस्सा मेरे नियंत्रण में नहीं है। – Ciantic

+0

मैंने पहली बार सोचा था कि मैं Django ऐप को हैक करना नहीं चाहता, लेकिन फिर यह तेजी से समाधान हो सकता है। तो यहां मेरा सरल [जेएसओएन सत्र स्टोर Django के लिए] है (http://gist.github.com/441132) – Ciantic

5

क्या आप सिस्टम कॉल कर सकते हैं? आप इस प्रकार का अजगर स्क्रिप्ट का उपयोग कर सकता है json में अचार डेटा कन्वर्ट करने के लिए:

<?php 
    exec("python pickle2json.py -p pickled_data.txt", $json_data = array()); 
?> 

या यदि:

# pickle2json.py 
import sys, optparse, cPickle, os 
try: 
    import json 
except: 
    import simplejson as json 

# Setup the arguments this script can accept from the command line 
parser = optparse.OptionParser() 
parser.add_option('-p','--pickled_data_path',dest="pickled_data_path",type="string",help="Path to the file containing pickled data.") 
parser.add_option('-j','--json_data_path',dest="json_data_path",type="string",help="Path to where the json data should be saved.") 
opts,args=parser.parse_args() 

# Load in the pickled data from either a file or the standard input stream 
if opts.pickled_data_path: 
    unpickled_data = cPickle.loads(open(opts.pickled_data_path).read()) 
else: 
    unpickled_data = cPickle.loads(sys.stdin.read()) 

# Output the json version of the data either to another file or to the standard output 
if opts.json_data_path: 
    open(opts.json_data_path, 'w').write(json.dumps(unpickled_data)) 
else: 
    print json.dumps(unpickled_data) 

इस तरह, यदि आपके एक फ़ाइल से डेटा हो रही आप कुछ इस तरह कर सकता है आप किसी फ़ाइल को यह करने के लिए इसे बाहर सहेजना चाहते:

<?php 
    system("python pickle2json.py -p pickled_data.txt -j p_to_j.json"); 
?> 

सभी संभावित रूप से ऊपर कोड सही नहीं (मैं एक PHP डेवलपर नहीं कर रहा हूँ) है, लेकिन आप के लिए यह काम की तरह कुछ होता?

1

यदि आपके द्वारा दिखाए गए कोड द्वारा अचार बनाया जा रहा है, तो इसमें बाइनरी डेटा नहीं होगा - जब तक कि आप न्यूलाइन "बाइनरी डेटा" नहीं बुला रहे हों। the Python docs देखें। निम्नलिखित कोड पायथन 2.6 द्वारा चलाया गया था।

>>> import cPickle 
>>> data = {'user_id': 5} 
>>> for protocol in (0, 1, 2): # protocol 0 is the default 
...  print protocol, repr(cPickle.dumps(data, protocol)) 
... 
0 "(dp1\nS'user_id'\np2\nI5\ns." 
1 '}q\x01U\x07user_idq\x02K\x05s.' 
2 '\x80\x02}q\x01U\x07user_idq\x02K\x05s.' 
>>> 

उपर्युक्त में से कौन सा आप देख रहे हैं जैसा दिखता है? क्या आप एक हेक्स संपादक/डम्पर द्वारा प्रदर्शित मसालेदार फ़ाइल सामग्री पोस्ट कर सकते हैं या जो कुछ भी पाइथन के repr() के बराबर PHP है? एक ठेठ शब्दकोश में कितनी वस्तुएं हैं? "पूर्णांक" और "8-बिट बाइट्स की स्ट्रिंग" के अलावा कौन से डेटा प्रकार (क्या एन्कोडिंग?)?

0

मुझे एक ही समस्या थी। मुझे कोई समाधान नहीं मिला है इसलिए मैंने PHP में पाइथन मॉड्यूल का अपना न्यूनतम पोर्ट बनाया है। बाद में मुझे ज़ेन फ्रेमवर्क से ज़ेंड सीरियलाइज़र एडाप्टर पायथन पिक्सेल मिला।

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