মুদ্রণ ফাংশন আউটপুট ফ্লাশ কিভাবে?


1215

আমি কীভাবে পাইথনের মুদ্রণ ফাংশনটিকে স্ক্রিনে আউটপুট করতে বাধ্য করব?

এটি আউটপুট বাফারিং অক্ষম করার সদৃশ নয় - লিঙ্কযুক্ত প্রশ্নটি আনফারড আউটপুট দেওয়ার চেষ্টা করছে, যখন এটি আরও সাধারণ। এই প্রশ্নের শীর্ষের উত্তরগুলি খুব শক্তিশালী বা এটির জন্য জড়িত (এটির জন্য তারা ভাল উত্তর নয়), এবং এই প্রশ্নটি গুগলে কোনও আপেক্ষিক নবাগত খুঁজে পেতে পারে।

উত্তর:


1425

পাইথন 3 এ, printএকটি alচ্ছিক flushযুক্তি নিতে পারে

print("Hello world!", flush=True)

পাইথন 2 এ আপনাকে করতে হবে

import sys
sys.stdout.flush()

ফোন করার পরে print। ডিফল্টরূপে, printপ্রিন্ট করে sys.stdout( ফাইল অবজেক্ট সম্পর্কে আরও ডকুমেন্টেশন দেখুন )।


346

চলমান python -h, আমি একটি কমান্ড লাইন বিকল্প দেখতে পেয়েছি :

-উ: আনফফার্ড বাইনারি স্টডআউট এবং স্টডারার; এছাড়াও পাইথুনবুফেরড = এক্স '-উ' সম্পর্কিত অভ্যন্তরীণ বাফারিংয়ের বিশদগুলির জন্য ম্যান পৃষ্ঠাটি দেখুন

এখানে প্রাসঙ্গিক ডক


320

পাইথন ৩.৩ থেকে আপনি সাধারণ print()ফাংশনটি ব্যবহারের প্রয়োজন ছাড়াই ফ্লাশ করতে বাধ্য করতে পারেন sys.stdout.flush(); কেবল "ফ্লাশ" কীওয়ার্ড আর্গুমেন্টটিকে সত্যে সেট করুন। ডকুমেন্টেশন থেকে :

মুদ্রণ (* অবজেক্টস, সেপ = '', শেষ = '\ n', ফাইল = সিজ.স্টডআউট, ফ্লাশ = ভুয়া)

স্ট্রিপ ফাইলে অবজেক্টগুলি মুদ্রণ করুন, সেপ দ্বারা পৃথক করা এবং শেষের পরে। সেপ, শেষ এবং ফাইল, উপস্থিত থাকলে কীওয়ার্ড আর্গুমেন্ট হিসাবে দিতে হবে।

সমস্ত অ-কীওয়ার্ড আর্গুমেন্ট স্ট্রিতে রূপান্তরিত হয় যেমন str () do এবং প্রবাহে লিখিত হয়, সেপ দ্বারা পৃথক করা হয় এবং এর শেষে হয়। সেপ এবং শেষ উভয়ই স্ট্রিং হতে হবে; সেগুলি কোনওটিই নয়, যার অর্থ ডিফল্ট মানগুলি ব্যবহার করা। যদি কোনও বস্তু দেওয়া না হয়, মুদ্রণ () কেবল শেষ লিখবে।

ফাইল আর্গুমেন্ট অবশ্যই রাইটিং (স্ট্রিং) পদ্ধতিযুক্ত একটি অবজেক্ট হতে হবে; যদি এটি উপস্থিত না থাকে বা কেউ না থাকে তবে sys.stdout ব্যবহৃত হবে। আউটপুট বাফার করা হয় কিনা তা সাধারণত ফাইল দ্বারা নির্ধারিত হয় তবে ফ্লাশ কীওয়ার্ড যুক্তিটি সত্য হলে স্ট্রিমটি জোর করে চাপানো হয়।


197

পাইথন প্রিন্টের ফ্লাশ আউটপুট কীভাবে?

আমি এটি করার পাঁচটি উপায়ের পরামর্শ দিচ্ছি:

  • পাইথন 3 এ কল করুন print(..., flush=True)(পাইথন 2 এর মুদ্রণ ফাংশনে ফ্লাশ যুক্তি উপলব্ধ নেই, এবং মুদ্রণ বিবৃতিটির জন্য কোনও অ্যানালগ নেই)।
  • file.flush()আউটপুট ফাইলটিতে কল করুন (এটি করার জন্য আমরা পাইথন 2 এর মুদ্রণ ফাংশনটি গুটিয়ে রাখতে পারি), উদাহরণস্বরূপ,sys.stdout
  • এটি মডিউলের প্রতিটি মুদ্রণ ফাংশন কলটিতে আংশিক ফাংশন সহ
    print = partial(print, flush=True)প্রয়োগ করুন, মডিউলটি বিশ্বব্যাপী প্রয়োগ করা হবে।
  • -uএটি ইন্টারপ্রিটার কমান্ডকে একটি পতাকা ( ) দিয়ে প্রক্রিয়ায় প্রয়োগ করুন
  • আপনার পরিবেশের প্রতিটি অজগর প্রক্রিয়াতে এটি প্রয়োগ করুন PYTHONUNBUFFERED=TRUE(এবং এটিকে পূর্বাবস্থায় ফেলার জন্য পরিবর্তনশীলটি আনসেট করুন)।

পাইথন ৩.৩++

পাইথন ৩.৩ বা ততোধিক উচ্চতর ব্যবহার করে আপনি কেবল ফাংশনটিতে flush=Trueএকটি মূলশব্দ যুক্তি হিসাবে সরবরাহ করতে পারেন print:

print('foo', flush=True) 

পাইথন 2 (বা <3.3)

তারা flushপাইথন ২.7 এ যুক্তিটির ব্যাকপোর্ট করেনি তাই আপনি যদি পাইথন ২ ব্যবহার করেন (বা ৩.৩ এর চেয়ে কম) এবং যদি কোডটি 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

আপনি একটি মডিউলটির বিশ্বব্যাপী ফান্টুলস.পার্পিয়াল ব্যবহার করে মুদ্রণ ফাংশনের জন্য ডিফল্ট পরিবর্তন করতে পারেন:

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

ডক্স থেকে :

স্টিডিন, স্টডআউট এবং স্ট্ডারকে পুরোপুরি অবিরাম হতে বাধ্য করুন। যে সিস্টেমে এটি গুরুত্বপূর্ণ সেখানে স্টিন, স্ট্ডআউট এবং স্টার্ডারকে বাইনারি মোডে রাখুন।

নোট করুন যে file.readlines () এবং ফাইল অবজেক্টস (sys.stdin লাইনের জন্য) এ অভ্যন্তরীণ বাফারিং রয়েছে যা এই বিকল্প দ্বারা প্রভাবিত নয়। এটির কাজ করার জন্য, আপনি 1: লুপের মধ্যেই ফাইল ড্রেডলাইন () ব্যবহার করতে চান।

শেল অপারেটিং পরিবেশের জন্য ডিফল্ট পরিবর্তন করা হচ্ছে

পরিবেশ বা পরিবেশের সমস্ত অজগর প্রক্রিয়াগুলির জন্য আপনি এই আচরণটি পেতে পারেন যদি আপনি পরিবেশকে পরিবর্তনযোগ্য কোনও স্ট্রিংয়ে সেট করেন:

যেমন লিনাক্স বা ওএসএক্সে:

$ export PYTHONUNBUFFERED=TRUE

বা উইন্ডোজ:

C:\SET PYTHONUNBUFFERED=TRUE

ডক্স থেকে :

PYTHONUNBUFFERED

যদি এটি একটি খালি খালি স্ট্রিংয়ে সেট করা থাকে তবে এটি -u বিকল্পটি নির্দিষ্ট করার সমান।


অভিযোজ্য বস্তু

পাইথন ২.7.১২ থেকে মুদ্রণ ফাংশনে সহায়তা এখানে রয়েছে - নোট করুন যে কোনও 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কারণ "পাইথন ৩.৩-এ ফ্লাশ যুক্তি যুক্ত করা হয়েছিল (মুদ্রণের পরে) ভবিষ্যতের আমদানির মাধ্যমে ২.7 এ ব্যাকপোর্ট করা হয়েছিল)" বাগসপিপিথন.অর্গ
অলিভার

69

এছাড়াও এই ব্লগে যেমন পরামর্শ দেওয়া হয়েছে তেমন কেউ একটি sys.stdoutআনফার্ড মোডে আবার খুলতে পারেন :

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

প্রতিটি stdout.writeএবং printঅপারেশন স্বয়ংক্রিয়ভাবে পরে ফ্লাশ করা হবে।


2
পাইথন ২.7-এ উবুন্টু ১২.০৪-এ আমাকে দেয়UnsupportedOperation: IOStream has no fileno.
ড্রেভিকো

3
উফফ, পাইথন 3 এটি খুঁজে পেয়েছে। এটি আমাকে এই কোডের টুকরোটি কার্যকর করতে দেয় না!
ইকনস

আমি এই মূর্খতা দ্বারা বিভ্রান্ত। আপনি এটি করার পরে, এখন দুটি ফাইল-জাতীয় বস্তু (মূল sys.stdout এবং নতুন sys.stdout) নেই যা উভয়ই মনে করেন যে তারা ফাইলনোর "মালিকানাধীন"? এটা ঠিক, তাই না?
ডন হ্যাচ


36

-uকমান্ড-লাইন সুইচ ব্যবহার করে কাজ করে তবে এটি কিছুটা আনাড়ি। এর অর্থ হ'ল যদি ব্যবহারকারী কোনও -uবিকল্প ছাড়াই স্ক্রিপ্টটি চালিত করেন তবে প্রোগ্রামটিটি সম্ভবত ভুল আচরণ করবে । আমি সাধারণত একটি প্রথা ব্যবহার করি stdout:

class flushfile:
  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স্পষ্টভাবে ব্যবহার করে ), স্বয়ংক্রিয়ভাবে flushএড হবে।


4
আমি ফাইল থেকে উত্তরাধিকারসূত্রে না নেওয়ার এবং তারপরে যুক্ত করে স্টাডআউটে ডেলিগেশন দেওয়ার পরামর্শ দিই। def __getattr__(self,name): return object.__getattribute__(self.f, name)
23:21

2
@ ডেডথ্রি টাইমসের মন্তব্যে প্রস্তাবিত পরিবর্তনগুলি ছাড়াই, আমি "ভ্যালুআরার: বন্ধ ফাইলের মধ্যে I / O ক্রিয়াকলাপ"
পেয়েছি

19

কেন একটি অপ্রয়োজনীয় ফাইল ব্যবহারের চেষ্টা করবেন না?

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

অথবা

sys.stdout = open('out.log', 'a', 0)

1
তিনি চাইছেন না একটি অনাবন্ধিত ফাইল তৈরি করুন; তিনি বিদ্যমান স্টডআউট (কনসোল, টার্মিনাল বা যা কিছুতে পুনঃনির্দেশিত: এটি পরিবর্তন করা উচিত নয়) আনফফার করতে চান।
ব্লুফাস্ট

13

ড্যানের ধারণাটি তেমন কার্যকর হয় না:

#!/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):

এটি ঠিক কাজ করে তোলে।


17
কোনও ভোট নেই কারণ এই আইএস ড্যানের সমাধান ... (তার সমাধানের অনুলিপি করার পরিবর্তে আপনার ড্যানের পোস্টে মন্তব্য করা উচিত)
জেকো

8

এখানে আমার সংস্করণ, যা লিপি () এবং ফাইলনো () সরবরাহ করে:

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()

উচ্চতর সমাধান। এবং এটি কাজ করে। পাইথন ৩.৪.০-তে পরীক্ষা করা হয়েছে। অন্যান্য সংস্করণগুলির সাথে, যা থেকে এসেছে file, আমি একটি ত্রুটি পেয়েছি। কোনও fileক্লাস নেই।
কলিন ডি বেনেট

6

পাইথন 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)

2
অন্যান্য সমস্ত উচ্চ মানের প্রতিক্রিয়া দেওয়া এই উত্তরটি একটু হালকা মনে হচ্ছে। আপনি এটিতে আরও কিছু যুক্ত করতে পারেন।
সেমিকোলনস এবং নালী টেপ

5

পাইথনের ৩.৪-তে এটি এটি করেছি:

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

2

ফ্লাশ অপশনটি কীভাবে কাজ করছে তা বুঝতে আমি প্রথমে লড়াই করেছি led আমি একটি 'লোডিং ডিসপ্লে' করতে চেয়েছিলাম এবং আমি এর সমাধানটি পেয়েছি:

for i in range(100000):
    print('{:s}\r'.format(''), end='', flush=True)
    print('Loading index: {:d}/100000'.format(i+1), end='')

প্রথম লাইনটি পূর্ববর্তী মুদ্রণটিকে ফ্লাশ করে এবং দ্বিতীয় লাইনটি একটি নতুন আপডেট হওয়া বার্তা প্রিন্ট করে। আমি জানি না যে এখানে একটি-লাইন বাক্য গঠন রয়েছে কিনা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.