2010-05-12 28 views
7

मैं एक सरल उपकरण है जो डिस्क से फाइल पढ़ता है, कुछ छवि प्रसंस्करण करता है, और एल्गोरिथ्म के परिणाम देता है लिखने के लिए कोशिश कर रहा हूँ वापस जाएँ। चूंकि कार्यक्रम कभी-कभी थोड़ी देर ले सकता है, इसलिए मुझे प्रगति पट्टी चाहिए क्योंकि मुझे पता है कि यह कार्यक्रम में कहां है। और चूंकि मैं अपनी कमांड लाइन को अव्यवस्थित करना पसंद नहीं करता हूं और मैं यूनिक्स प्लेटफ़ॉर्म पर हूं, इसलिए मैं केवल एक पंक्ति पर प्रगति पट्टी मुद्रित करने के लिए '\ r' वर्ण का उपयोग करना चाहता था।अजगर प्रिंट बयान प्रिंट कुछ भी नहीं

लेकिन जब मेरे पास यह कोड है, तो यह कुछ भी प्रिंट नहीं करता है।

मैं भी कोशिश की है:


heartbeat = 1 
while True: 
    print '\rHello, world', heartbeat, 
    heartbeat += 1 

इस कोड को पूरी तरह से काम करता है:


print '\r', i, '/', len(files), 

अब बस यकीन है कि यह अजगर में काम करने के लिए, मैं इस कोशिश की। क्या चल रहा है? लिनक्स पर कैरिज रिटर्न की मेरी समझ यह थी कि यह लाइन फीड कैरेक्टर को शुरुआत में ले जायेगा और फिर मैं पुराने टेक्स्ट को ओवरराइट कर सकता हूं, जब तक कि मैं कहीं भी एक नई लाइन प्रिंट नहीं करता। ऐसा प्रतीत नहीं होता है हालांकि।

इसके अलावा, वहाँ है कि मैं क्या वर्तमान करने के लिए कोशिश कर रहा हूँ की तुलना में एक कमांड लाइन में एक प्रगति बार प्रदर्शित करने के लिए एक बेहतर तरीका है?

+3

http://pypi.python.org/pypi/progressbar – kennytm

उत्तर

10

प्रिंट बयान के बाद sys.stdout.flush() जोड़ने की कोशिश की कोशिश करो। यह संभव है कि print तब तक आउटपुट फ्लश नहीं कर रहा जब तक कि यह एक नई लाइन लिखता न हो, जो यहां नहीं होता है।

+0

हाँ, उसने ऐसा किया। अभी भी पूरी तरह से यकीन नहीं है कि हैलो विश्व उदाहरण क्यों काम करता है। इसने लाइन फीड जारी नहीं किया था। हो सकता है क्योंकि प्रिंट स्टेटमेंट पर्याप्त चल रहा था कि यह निश्चित संख्या के बाद बफर को ऑटो-फ्लश कर रहा था? –

+0

हां, यह पूरा हो जाने पर बफर को फ्लश करना होगा। – interjay

+0

वैकल्पिक रूप से, कोई 'sys का उपयोग कर सकता है।स्क्रीन पर तुरंत प्रिंट करने के लिए stderr'। डिफ़ॉल्ट रूप से 'stderr' unbuffered है। – amphetamachine

2

लिनक्स में कैरिएज रिटर्न की हैंडलिंग टर्मिनल emulators के बीच बहुत अलग है।

आम तौर पर, एक टर्मिनल मुक्ति कोड कि टर्मिनल एमुलेटर बता स्क्रीन के चारों ओर आभासी "गाड़ी" स्थानांतरित करने के लिए होता है (लगता है बीबीएस लाइनों पर चल पूर्ण स्क्रीन प्रोग्राम) का प्रयोग करेंगे।

\e[A: अप
\e[B:
\e[C नीचे: सही
\e[D: लोगों को मैं के बारे में पता कर रहा हूँ VT100 मुक्ति कोड हैं
\e[1~ छोड़ दिया: घर
\e[4~: अंत

जहां \e बचने वाला चरित्र है, \x1b

\e[1~

के साथ सभी \r की जगह भी देखें this post

+0

क्यों अपने दूसरे उदाहरण काम होगा, तो? – danben

2

अपने टर्मिनल लाइन बफ़र है, तो आप अपने मुद्रण को देखने के लिए अगर आप एक linefeed जारी नहीं करते एक sys.stdout.flush() पड़ सकता है।

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