पायथन प्रिंट का आउटपुट फ्लश कैसे करें?
मैं यह करने के पाँच तरीके सुझाता हूँ:
- पायथन 3 में, कॉल
print(..., flush=True)
(फ्लश तर्क पायथन 2 के प्रिंट फ़ंक्शन में उपलब्ध नहीं है, और प्रिंट स्टेटमेंट के लिए कोई एनालॉग नहीं है)।
file.flush()
आउटपुट फ़ाइल पर कॉल करें (हम ऐसा करने के लिए अजगर 2 के प्रिंट फ़ंक्शन को लपेट सकते हैं), उदाहरण के लिए,sys.stdout
- मॉड्यूल के लिए एक आंशिक फ़ंक्शन के साथ प्रत्येक प्रिंट फ़ंक्शन कॉल में इसे
print = partial(print, flush=True)
लागू करें, मॉड्यूल ग्लोबल पर लागू किया जाए।
-u
इंटरप्रेटर कमांड में पारित एक ध्वज ( ) के साथ इस प्रक्रिया पर लागू करें
- इसे अपने वातावरण में हर अजगर प्रक्रिया के साथ लागू करें
PYTHONUNBUFFERED=TRUE
(और इसे पूर्ववत करने के लिए चर को अनसेट करें)।
पायथन 3.3+
पायथन 3.3 या उच्चतर का उपयोग करके, आप केवल फ़ंक्शन के 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
आप किसी मॉड्यूल के वैश्विक दायरे पर functionalools.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
फ़ंक्शन (या मौजूदा वैश्विक दायरे में पायथन 2 में से एक का उपयोग करते हुए, संगतता फ़ंक्शन को अप्रतिबंधित करेगा)।
यदि आप मॉड्यूल के वैश्विक दायरे के बजाय एक फ़ंक्शन के अंदर ऐसा करना चाहते हैं, तो आपको इसे एक अलग नाम देना चाहिए, जैसे:
def foo():
printf = functools.partial(print, flush=True)
printf('print stuff like this')
यदि आप इसे किसी फ़ंक्शन में वैश्विक घोषित करते हैं, तो आप इसे मॉड्यूल के वैश्विक नामस्थान पर बदल रहे हैं, इसलिए आपको इसे केवल वैश्विक नामस्थान में रखना चाहिए, जब तक कि विशिष्ट व्यवहार वैसा ही न हो जैसा आप चाहते हैं।
प्रक्रिया के लिए डिफ़ॉल्ट बदलना
मुझे लगता है कि यहां सबसे अच्छा विकल्प -u
झंडे का उपयोग करने के लिए असंबद्ध आउटपुट प्राप्त करना है।
$ python -u script.py
या
$ python -um package.module
से डॉक्स :
बल स्टड, stdout और stderr पूरी तरह से अप्रभावित होने के लिए। उन प्रणालियों पर जहां यह मायने रखता है, बाइनरी मोड में स्टडिन, स्टडआउट और स्टेडर भी डालते हैं।
ध्यान दें कि file.readlines () और फ़ाइल ऑब्जेक्ट्स (sys.stdin में लाइन के लिए) में आंतरिक बफरिंग है, जो इस विकल्प से प्रभावित नहीं है। इसके आसपास काम करने के लिए, आप 1: लूप के अंदर file.readline () का उपयोग करना चाहेंगे।
शेल ऑपरेटिंग वातावरण के लिए डिफ़ॉल्ट बदलना
यदि आप पर्यावरण चर को गैर-रिक्त स्ट्रिंग में सेट करते हैं, तो आप इस व्यवहार को पर्यावरण या वातावरण से प्राप्त होने वाली वातावरण की सभी प्रक्रियाओं के लिए प्राप्त कर सकते हैं:
उदाहरण के लिए, लिनक्स या OSX में:
$ 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.
__future__
संस्करण में शामिल नहीं हैflush
क्योंकि "फ्लश तर्क को पायथन 3.3 में जोड़ा गया था (प्रिंट के बाद) भविष्य के आयात के माध्यम से 2.7 में वापस कर दिया गया था" " Bugs.python.org/issive28458