दिलचस्प पोस्ट
मैं इस संदर्भ को एक समारोह में कैसे पारित करूं? क्या मैं किसी विधि में कोड का निरीक्षण करने के लिए प्रतिबिंब का उपयोग कर सकता हूं? जीजीप्लोट में विशेष चर (..काउंट .., ..density .., आदि) सरणी में 'अपरिभाषित' तत्वों के लिए 'ऑपरेटर' में जावास्क्रिप्ट कैसे मेरी WCF सेवा अतुल्यकालिक को कॉल करने के लिए? मैं नए टैब में एक लिंक कैसे खोल सकता हूं (और नई विंडो नहीं)? टेम्पलेट के साथ सी + + अंतर्निहित प्रकार रूपांतरण दूसरे फ्रेम के संदर्भ में JQuery चलाएं प्रतिक्रिया / जेएसएक्स गतिशील घटक नाम यदि printf को गलत स्वरूप स्ट्रिंग के साथ कहा जाता है तो क्या हो सकता है? क्या मैं पृथक गुंजाइश के साथ एनजी-मॉडल का उपयोग कर सकता हूं? जावा अनुप्रयोग में अनुकूलन शॉर्टकट AJAX Mailchimp पंजीकरण फॉर्म एकीकरण .NET XML सीरियलाइजेशन गेचस? जावास्क्रिप्ट से web.config पढ़ना

पायथन प्रिंट का आउटपुट फ़्लश कैसे करें?

पायथन की प्रिंट फ़ंक्शन को स्क्रीन पर आउटपुट करने के लिए मैं कैसे बल देता हूं?

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

वेब के समाधान से एकत्रित समाधान "पायथन प्रिंट का आउटपुट फ़्लश कैसे करें?"

import sys sys.stdout.flush() 

डिफ़ॉल्ट रूप से मुद्रित करें sys.stdout मुद्रित करें।

संदर्भ:

python -h चल रहा है, मैं एक कमांड लाइन विकल्प देखता हूं:

-यू: अनबॉक्स्ड बाइनरी स्टडआउट और स्टेडरर; भी PYTHONUNBUFFERED = x '-u' से संबंधित आंतरिक बफरिंग पर विवरण के लिए मैन पेज देखें

यहाँ प्रासंगिक डॉक्टर है

पायथन 3.3 के बाद से, आप सामान्य print() फ़ंक्शन को sys.stdout.flush() का उपयोग किए बिना फ्लश करने के लिए मजबूर कर सकते हैं; बस "फ्लश" कीवर्ड तर्क को सही पर सेट करें। प्रलेखन से :

प्रिंट (* ऑब्जेक्ट्स, सेप = '', एंड = '\ n', फ़ाइल = sys.stdout, flush = False)

ऑब्जेक्ट्स स्ट्रीम फ़ाइल में मुद्रित करें, sep द्वारा अलग और अंत के बाद। sep, end और file, यदि मौजूद है, तो कीवर्ड तर्क के रूप में दिए जाने चाहिए।

सभी गैर-कीवर्ड तर्क स्ट्रिंग्स में बदल जाते हैं जैसे कि str () करता है और धारा को लिखा जाता है, जो कि sep द्वारा अलग होता है और अंत में उसके बाद होता है दोनों sep और अंत स्ट्रिंग होना चाहिए; वे कोई भी नहीं हो सकते, जिसका अर्थ है डिफ़ॉल्ट मान का उपयोग करना। यदि कोई वस्तु नहीं दी गई है, तो प्रिंट () बस अंत लिखेंगे

फ़ाइल तर्क एक लेखन (स्ट्रिंग) विधि के साथ एक ऑब्जेक्ट होना चाहिए; अगर यह मौजूद नहीं है या कोई नहीं, sys.stdout का उपयोग किया जाएगा। क्या आउटपुट बफ़र दिया जाता है, यह आमतौर पर फाइल द्वारा निर्धारित किया जाता है, लेकिन यदि फ्लश कीवर्ड तर्क सही है, तो स्ट्रीम को जबरन रूप से फ़्लश किया जाता है।

इसके अलावा इस ब्लॉग में सुझाए गए किसी भी रूप में sys.stdout में sys.stdout को फिर से खोल सकते हैं:

 sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) 

प्रत्येक stdout.write और print ऑपरेशन स्वचालित रूप से बाद में प्लावित हो जाएगा।

पायथन प्रिंट का आउटपुट फ़्लश कैसे करें?

मैं यह करने के पांच तरीकों का सुझाव देता हूं:

  • flush=True साथ कॉल प्रिंट करें flush=True तर्क।
  • आउटपुट फ़ाइल पर file.flush() को कॉल करें (हम अजगर 2 के प्रिंट फ़ंक्शन को ऐसा करने के लिए), उदाहरण के लिए, sys.stdout
  • आंशिक फ़ंक्शन के साथ मॉड्यूल में प्रत्येक प्रिंट फ़ंक्शन कॉल पर इसे लागू करें,
    print = partial(print, flush=True) मॉड्यूल वैश्विक पर लागू होता है
  • इस प्रक्रिया को एक फ्लैग ( -u ) के साथ इंटरप्रीटर कमांड को दिया जाता है
  • इसे अपने पर्यावरण में हर अजगर प्रक्रिया पर लागू करें PYTHONUNBUFFERED=TRUE (और इसे पूर्ववत करने के लिए चर सेट से)

पायथन 3.3+

पायथन 3.3 या उच्चतर का उपयोग करके, आप केवल flush=True प्रदान कर सकते हैं flush=True print फ़ंक्शन के लिए एक कीवर्ड तर्क के रूप में:

 print('foo', flush=True) 

पायथन 2 (या <3.3)

उन्होंने flush तर्क को पायथन 2.7 में बैकपोर्ट नहीं किया है, इसलिए यदि आप पायथन 2 (या 3.3 से कम) का उपयोग कर रहे हैं, और चाहते हैं कि कोड 2 और 3 दोनों के साथ संगत है, तो मैं निम्नलिखित संगतता कोड का सुझाव दे सकता हूं (ध्यान दें __future__ आयात आपके मॉड्यूल के शीर्ष के निकट / बहुत ही अधिक होना चाहिए):

 from __future__ import print_function import sys if sys.version_info[:2] < (3, 3): old_print = print def print(*args, **kwargs): flush = kwargs.pop('flush', False) old_print(*args, **kwargs) if flush: file = kwargs.get('file', sys.stdout) # Why might file=None? IDK, but it works for print(i, file=None) file.flush() if file is not None else sys.stdout.flush() 

उपरोक्त संगतता कोड अधिकांश उपयोगों को कवर करेगा, लेकिन अधिक गहन उपचार के लिए, six मॉड्यूल देखें ।

वैकल्पिक रूप से, आप मुद्रण के बाद file.flush() को कॉल कर सकते हैं, उदाहरण के लिए, पायथन 2 में प्रिंट स्टेटमेंट के साथ:

 import sys print 'delayed output' sys.stdout.flush() 

एक मॉड्यूल में डिफ़ॉल्ट flush=True करने के लिए flush=True बदलने

मॉड्यूल के वैश्विक दायरे पर functools.partial का उपयोग कर आप प्रिंट फ़ंक्शन के लिए डिफ़ॉल्ट को बदल सकते हैं:

 import functools print = functools.partial(print, flush=True) 

यदि आप हमारे नए आंशिक फ़ंक्शन को देखते हैं, तो कम से कम पायथन 3 में:

 >>> print = functools.partial(print, flush=True) >>> print functools.partial(<built-in function print>, flush=True) 

हम देख सकते हैं कि यह सामान्य की तरह कार्य करता है:

 >>> print('foo') foo 

और हम वास्तव में नए डिफ़ॉल्ट को ओवरराइड कर सकते हैं:

 >>> print('foo', flush=False) foo 

फिर से ध्यान दें, यह केवल वर्तमान वैश्विक क्षेत्र को बदलता है, क्योंकि मौजूदा वैश्विक दायरे पर प्रिंट का नाम अंतर्निहित print फ़ंक्शन (या संगतता फ़ंक्शन का dereference, यदि वह वर्तमान वैश्विक गुंजाइश में पायथन 2 का उपयोग कर रहा है) को छिपा देगा।

यदि आप इसे मॉड्यूल के वैश्विक दायरे के बजाय फ़ंक्शन के अंदर करना चाहते हैं, तो आपको इसे एक अलग नाम देना चाहिए, जैसे:

 def foo(): printf = functools.partial(print, flush=True) printf('print stuff like this') 

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

प्रक्रिया के लिए डिफ़ॉल्ट को बदलना

मुझे लगता है कि यहां सबसे अच्छा विकल्प- un flagged output को प्राप्त करने के लिए -u ध्वज का उपयोग करना है

 $ python -u script.py 

या

 $ python -um package.module 

डॉक्स से :

फोर्स स्टैडीन, स्टेडाउट और स्टेडरर को पूरी तरह से बंधा हुआ होना चाहिए। जिन सिस्टमों में यह मायने रखता है, उन पर स्टडीन, स्टडआउट और स्टेडरर को बाइनरी मोड में भी रखा गया है।

ध्यान दें कि फ़ाइल में आंतरिक बफ़रिंग है। रोड़े () और फ़ाइल ऑब्जेक्ट (sys.stdin में पंक्ति के लिए) जो इस विकल्प से प्रभावित नहीं है इसके आस-पास काम करने के लिए, आप file :readline () थोड़ी देर 1: लूप का उपयोग करना चाहेंगे।

शैल परिचालन वातावरण के लिए डिफ़ॉल्ट को बदलना

पर्यावरण या वातावरण में सभी अजगर प्रक्रियाओं के लिए आप इस व्यवहार को प्राप्त कर सकते हैं जो पर्यावरण से प्राप्त होता है यदि आप एक गैर-रहित स्ट्रिंग में परिवेश चर सेट करते हैं:

उदाहरण के लिए, लिनक्स या ओएसएक्स में:

 $ export PYTHONUNBUFFERED=TRUE 

या विंडोज:

 C:\SET PYTHONUNBUFFERED=TRUE 

डॉक्स से :

PYTHONUNBUFFERED

यदि यह एक गैर-रिक्त स्ट्रिंग पर सेट है तो यह -u विकल्प निर्दिष्ट करने के बराबर है।


परिशिष्ट

यहाँ पायथन 2.7.12 से प्रिंट फ़ंक्शन पर सहायता है – ध्यान दें कि कोई flush तर्क नहीं है:

 >>> from __future__ import print_function >>> help(print) print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. 

-u कमांड-लाइन स्विच का उपयोग करना कार्य करता है, लेकिन यह थोड़ा अजीब है इसका मतलब यह होगा कि कार्यक्रम संभावित रूप से गलत तरीके से व्यवहार करेगा यदि उपयोगकर्ता ने -u विकल्प के बिना स्क्रिप्ट को लागू किया। मैं आमतौर पर एक कस्टम stdout उपयोग करते हैं, जैसे:

 class flushfile(object): def __init__(self, f): self.f = f def write(self, x): self.f.write(x) self.f.flush() import sys sys.stdout = flushfile(sys.stdout) 

… अब आपके सभी print कॉल्स (जो कि sys.stdout उपयोग sys.stdout ) स्वचालित रूप से flush एड होंगे

क्यों नहीं एक unbuffered फ़ाइल का उपयोग करने की कोशिश?

 f = open('xyz.log', 'a', 0) 

या

 sys.stdout = open('out.log', 'a', 0) 
 import sys print 'This will be output immediately.' sys.stdout.flush() 

दान का विचार काफी काम नहीं करता है:

 #!/usr/bin/env python class flushfile(file): def __init__(self, f): self.f = f def write(self, x): self.f.write(x) self.f.flush() import sys sys.stdout = flushfile(sys.stdout) print "foo" 

परिणाम:

 Traceback (most recent call last): File "./passpersist.py", line 12, in <module> print "foo" ValueError: I/O operation on closed file 

मुझे विश्वास है कि समस्या यह है कि यह फ़ाइल वर्ग से प्राप्त होती है, जो वास्तव में आवश्यक नहीं है Sys.stdout के लिए दस्तावेज़ के अनुसार:

stdout और stderr की जरूरत नहीं निर्मित में फाइल ऑब्जेक्ट्स: किसी भी ऑब्जेक्ट स्वीकार्य है जब तक यह एक लिखने () विधि है जो स्ट्रिंग तर्क लेता है।

तो बदल रहा है

 class flushfile(file): 

सेवा मेरे

 class flushfile(object): 

यह सिर्फ ठीक काम करता है।

पायथन 3.x के साथ उन्होंने print() फ़ंक्शन विस्तारित किया:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

तो, आप यह कर सकते हैं:

print("Visiting toilet", flush=True)


पायथन डॉक्स एंट्री

यहां मेरा संस्करण है, जो लेखों () और फ़िलिनो () प्रदान करता है:

 class FlushFile(object): def __init__(self, fd): self.fd = fd def write(self, x): ret = self.fd.write(x) self.fd.flush() return ret def writelines(self, lines): ret = self.writelines(lines) self.fd.flush() return ret def flush(self): return self.fd.flush def close(self): return self.fd.close() def fileno(self): return self.fd.fileno() 

दान के समाधान से प्यार! अजगर 3 के लिए करें:

 import io,sys class flushfile: def __init__(self, f): self.f = f def write(self, x): self.f.write(x) self.f.flush() sys.stdout = flushfile(sys.stdout) 

मैंने इसे Python 3.4 में पसंद किया था:

 '''To write to screen in real-time''' message = lambda x: print(x, flush=True, end="") message('I am flushing out now...') 

पायथन 3 में आप प्रिंट सेट को डिफ़ॉल्ट सेट के साथ flush = True ओवरराइट कर सकते हैं

 def print(*objects, sep=' ', end='\n', file=sys.stdout, flush=True): __builtins__.print(*objects, sep=sep, end=end, file=file, flush=flush)