2010-09-18 18 views
6

जब मैं अपने dev सर्वर पर एक यूनिकोड स्ट्रिंग मुद्रित करने का प्रयास करता हूं तो यह सही तरीके से काम करता है लेकिन उत्पादन सर्वर अपवाद उठाता है।पायथन प्रिंट विभिन्न सर्वरों पर अलग-अलग काम करता है

File "/home/user/twistedapp/server.py", line 97, in stringReceived 
    print "sent:" + json 
File "/usr/lib/python2.6/dist-packages/twisted/python/log.py", line 555, in write 
    d = (self.buf + data).split('\n') 
exceptions.UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 28: ordinal not in range(128) 

वास्तव में यह फ़ाइल को लॉग करने के लिए मुड़कर आवेदन और प्रिंट प्रिंट है।

तारों के repr() समान हैं। लोकेल en_US.UTF-8 पर सेट है।

क्या कोई कॉन्फ़िगरेशन है जो मुझे दोनों सर्वरों पर काम करने के लिए जांचने की आवश्यकता है? यूनिकोड तार के

+1

क्या ओएस और पायथन संस्करण सर्वर चल रहे हैं? – Puddingfox

+0

उबंटू 10.04 सर्वर दोनों – Soid

+0

और पायथन 2.6.5 – Soid

उत्तर

1

यूनिकोड ट्विस्ट के अंतर्निहित लॉग पर्यवेक्षकों द्वारा समर्थित नहीं है। इसके लिए समर्थन जोड़ने पर प्रगति के लिए http://twistedmatrix.com/trac/ticket/989 देखें, या यह देखने के लिए कि आप सहायता के लिए क्या कर सकते हैं।

# 98 9 तक हल हो गया है और फिक्स एक ट्विस्ट रिलीज़ में है, आपका एप्लिकेशन तैनात है, यूनिकोड लॉग न करें। केवल str लॉग करें।

+0

यह विभिन्न सर्वरों पर अलग-अलग क्यों काम कर सकता है? – Soid

+0

यह ठीक होगा अगर मुझे एन्कोड या डीकोड या कुछ करने की आवश्यकता होगी। लेकिन उत्पादन सर्वर को डीकोड ('utf8') करने की आवश्यकता है और dev सर्वर इसे करने की अनुमति नहीं देता है। – Soid

7

print आईएनजी sys.stdout (प्रक्रिया के मानक आउटपुट) एक सही .encoding विशेषता है कि अजगर एक बाइट स्ट्रिंग में यूनिकोड स्ट्रिंग सांकेतिक शब्दों में बदलना करने के लिए आवश्यक मुद्रण प्रदर्शन करने के लिए उपयोग कर सकते हैं होने पर निर्भर करता है - और उस सेटिंग पर निर्भर करता है जिस तरह से ओएस स्थापित है, जहां मानक आउटपुट निर्देशित किया जाता है, और आगे।

यदि ऐसी कोई विशेषता नहीं है, तो डिफ़ॉल्ट कोडितका उपयोग किया जाता है, और जैसा कि आपने देखा है, यह अक्सर वांछित परिणाम प्रदान नहीं करता है ;-)।

आप यह देखने के लिए getattr(sys.stdout, 'encoding', None) देख सकते हैं कि एन्कोडिंग है या नहीं (यदि यह है, तो आप केवल अपनी अंगुलियों को पार कर सकते हैं कि यह सही है ... या, शायद, सही सिस्टम पर अनुमान लगाने के लिए कुछ भारी प्लेटफ़ॉर्म-विशिष्ट चाल का प्रयास करें जांचने के लिए एन्कोडिंग ;-)। यदि यह सामान्य रूप से नहीं है, तो यह अनुमान लगाने के लिए कोई विश्वसनीय या क्रॉस-प्लेटफार्म तरीका नहीं है कि यह क्या हो सकता है। आप 'utf8' को आजमा सकते हैं, सार्वभौमिक एन्कोडिंग जो कई मामलों में काम करता है (निश्चित रूप से ascii से अधिक ;-) है, लेकिन यह वास्तव में रूले व्हील का एक स्पिन है।

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

यह भी पोर्टेबिलिटी के लिए, अपने खुद के एन्कोडिंग, वह यह है कि नहीं

print someunicode 

बल्कि

print someunicode.encode(thecodec) 

और वास्तव में प्रदर्शन करने के लिए, से, अगर आप अधूरा उत्पादन होगा बेहतर है एक दुर्घटना की तुलना में,

print someunicode.encode(thecodec, 'ignore') 

(जो बस एन को छोड़ देता है ऑन-encodable वर्ण), या, आम तौर पर बेहतर है,

print someunicode.encode(thecodec, 'replace') 

(जो गैर encodable पात्रों के लिए प्रश्न चिह्न प्लेसहोल्डर का उपयोग करता है)।

+2

मुझे लगता है कि यूनिक्स सिस्टम, sys.stdout पर यह उल्लेखनीय है।एन्कोडिंग 'LANG', 'LC_ALL' और' LC_CTYPE' पर्यावरण चर के आधार पर सेट की गई है, और यह केवल * सेट * सेट है यदि sys.stdout टर्मिनल से कनेक्ट है। जब आप आउटपुट को किसी फ़ाइल या किसी अन्य प्रोग्राम पर रीडायरेक्ट करते हैं तो वही काम करने वाले प्रिंट दुर्भाग्य से तोड़ सकते हैं। यह आपके यूनिकोड को स्पष्ट रूप से एन्कोड करने के लिए और भी महत्वपूर्ण बनाता है। –

+0

@ थॉमस, हाँ, बिल्कुल, उत्कृष्ट बिंदु! –

+0

यह लॉग आउट करने के लिए प्रिंट आउटपुट का कारण नहीं है। मैंने अपना प्रश्न अपडेट किया। आपके प्रतिक्रिया के लिए धन्येवाद। लोकेल दोनों सर्वरों पर en_US.UTF-8 पर सेट है। – Soid

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