के साथ काम नहीं करता है जब मैं पायथन में sysadmin स्क्रिप्ट लिख रहा हूं, sys.stdout पर बफर जो प्रिंट करने के लिए हर कॉल को प्रभावित करता है), क्योंकि मैं डॉन करता हूं एक बफर को फ्लश करने की प्रतीक्षा नहीं करना है और फिर स्क्रीन पर एक बार लाइनों का एक बड़ा हिस्सा प्राप्त करना चाहते हैं, इसके बजाय मैं स्क्रिप्ट द्वारा नए आउटपुट उत्पन्न होने के तुरंत बाद आउटपुट की अलग-अलग लाइनों को प्राप्त करना चाहता हूं। मैं न्यूलाइन के लिए भी इंतजार नहीं करना चाहता हूं इसलिए आउटपुट देखें।पायथन मानक idiom sys.stdout buffer को शून्य पर सेट करने के लिए यूनिकोड
एक अक्सर मुहावरा इस्तेमाल किया अजगर में यह करने के लिए
import os
import sys
sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)
यह एक लंबे समय के लिए मेरे लिए ठीक काम किया है। अब मैंने देखा, कि यह यूनिकोड के साथ काम नहीं करता है।
#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals
import os
import sys
print('Original encoding: {}'.format(sys.stdout.encoding))
sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)
print('New encoding: {}'.format(sys.stdout.encoding))
text = b'Eisb\xe4r'
print(type(text))
print(text)
text = text.decode('latin-1')
print(type(text))
print(text)
यह निम्न उत्पादन की ओर जाता है:: कृपया निम्न स्क्रिप्ट देख
Original encoding: UTF-8
New encoding: None
<type 'str'>
Eisb▒r
<type 'unicode'>
Traceback (most recent call last):
File "./export_debug.py", line 18, in <module>
print(text)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 4: ordinal not in range(128)
यह मुझे इसके लिए कारण नीचे ट्रैक करने के लिए घंटे लगे (अपने मूल स्क्रिप्ट इस न्यूनतम डिबगिंग स्क्रिप्ट से बहुत लंबे समय तक था)। यह लाइन
sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)
जो मैंने वर्षों से उपयोग की थी, इसलिए इससे कोई समस्या नहीं थी। बस इस लाइन पर टिप्पणी करें और सही आउटपुट इस तरह दिखना चाहिए:
Original encoding: UTF-8
New encoding: UTF-8
<type 'str'>
Eisb▒r
<type 'unicode'>
Eisbär
तो स्क्रिप्ट का क्या मतलब है? मेरी अजगर 2.7 कोड तैयार करने के लिए अधिक से अधिक निकट अजगर 3.x के लिए, मैं हमेशा उपयोग कर रहा हूँ
from __future__ import print_function, unicode_literals
जो अजगर नया प्रिंट का उपयोग करता है() - समारोह लेकिन अधिक महत्वपूर्ण: यह अजगर की दुकान सभी स्ट्रिंग्स के रूप में आता है डिफ़ॉल्ट रूप से आंतरिक रूप से यूनिकोड। मैं लैटिन -1/ISO-8859-1 इनकोडिंग डेटा का एक बहुत कुछ है, उदाहरण के लिए
text = b'Eisb\xe4r'
इसके साथ काम करने का इरादा भी तरह से, मैं यूनिकोड को यह पहली डिकोड करने के लिए की जरूरत है, कि क्या
text = text.decode('latin-1')
के लिए है। चूंकि डिफ़ॉल्ट एन्कोडिंग मेरे सिस्टम पर यूटीएफ -8 है, जब भी मैं एक स्ट्रिंग मुद्रित करता हूं, पाइथन आंतरिक यूनिकोड स्ट्रिंग को यूटीएफ -8 में एन्कोड करता है। लेकिन सबसे पहले यह आंतरिक यूनिकोड में आंतरिक रूप से होना चाहिए।
अब यह सब सामान्य रूप से ठीक काम करता है, अभी तक शून्य बाइट आउटपुट बफर के साथ नहीं। कोई विचार? मैंने देखा कि sys.stdout.encoding शून्य-बफरिंग लाइन के बाद अनसेट है, लेकिन मुझे नहीं पता कि इसे फिर से कैसे सेट करें। यह केवल पढ़ने योग्य विशेषता है और ओएस पर्यावरण चर LC_ALL या LC_CTYPE को केवल पाइथन दुभाषिया की शुरुआत में ही मूल्यांकन किया जाता है।
बीटीडब्ल्यू .: 'इस्बर्' 'ध्रुवीय भालू' के लिए जर्मन शब्द है।
@martineau ठीक है, sys.stdout = codecs.getwriter ('utf8') (sys.stdout) प्रस्ताव या तो काम नहीं करता है। मैंने वास्तव में बहुत कोशिश की और खोज की। तो मुझे लगता है कि बिना परीक्षण किए विचारों को लगता है कि ज्यादा मदद नहीं करते हैं। –
मैंने आपके लिए प्रश्न माइग्रेट कर दिया है। अगली बार, मॉडरेटर ध्यान के लिए बस 'ध्वज' और हमें बताएं कि आपको क्या चाहिए! :) – slhck
@ मार्टनलेहमान: तथ्य यह है कि यह अनचाहे था इसलिए मैंने इसे एक टिप्पणी के रूप में एक टिप्पणी के रूप में पोस्ट किया। – martineau