Sys.stdout.flush () পদ্ধতির ব্যবহার


উত্তর:


173

পাইথনের স্ট্যান্ডার্ড আউট বাফার করা হয়েছে (অর্থাত এটি টার্মিনালে লেখার আগে এটি স্ট্যান্ডার্ড আউট করার জন্য "লিখিত" কিছু ডেটা সংগ্রহ করে)। কলিং sys.stdout.flush()এটি বাফারকে "ফ্লাশ" করতে বাধ্য করে, যার অর্থ এটি বাফারে সমস্ত কিছু টার্মিনালে লিখবে, এমনকি যদি এটি সাধারণত এটি করার আগে অপেক্ষা করে।

এখানে কিছু ভাল তথ্য আছে (UN) কেন এটা দরকারী বাফার ইনপুট / আউটপুট এবং:
http://en.wikipedia.org/wiki/Data_buffer
বাফার বনাম unbuffered আই


@ সাইস্তোপিকারজ উইন্ডোতে বাফারটি ফ্লাশ করার জন্য আমরা কী করতে পারি?
অসহায়কির্ক

@ সাইস্টোপিকারজ আপনি কীভাবে চিত্রিত করবেন? যদি আমি অ্যান্ড্রু ক্লার্কের পাইথন স্ক্রিপ্টটি নিয়ে যাই এবং মুদ্রণ লাইনটি এর সাথে প্রতিস্থাপন sys.stdout.write("%d" % i)করি sys.stdout.flush()তবে স্ক্রিপ্টটি কার্যকর হওয়ার সাথে সাথে বাফারটি প্রদর্শনের জন্য আমাকে কলটি করতে হবে।
বেকন বিট

119

নিম্নলিখিত সাধারণ পাইথন স্ক্রিপ্ট বিবেচনা করুন:

import time
import sys

for i in range(5):
    print(i),
    #sys.stdout.flush()
    time.sleep(1)

এটি পাঁচ সেকেন্ডের জন্য প্রতি সেকেন্ডে একটি নম্বর মুদ্রণের জন্য ডিজাইন করা হয়েছে, তবে আপনি যদি এখন এটি চালান (আপনার ডিফল্ট সিস্টেম বাফারিংয়ের উপর নির্ভর করে) আপনি স্ক্রিপ্টটি শেষ না হওয়া পর্যন্ত কোনও আউটপুট দেখতে পাবেন না এবং তারপরে আপনি একবারে 0 1 2 3 4মুদ্রিত দেখতে পাবেন পর্দায়।

এর কারণ আউটপুটটি বাফার হচ্ছে এবং আপনি ফ্লাশ না করা পর্যন্ত sys.stdout প্রতিটিটির পরেprint না করেন আপনি অবিলম্বে আউটপুটটি দেখতে পাবেন না। sys.stdout.flush()পার্থক্যটি দেখতে লাইন থেকে মন্তব্য সরান ।


48
পাইথন ৩.x এ, 'মুদ্রণ আই' মুদ্রণের সাথে প্রতিস্থাপন করা উচিত (i, শেষ = '') কারণ পাইথন 3 এ মুদ্রণের (ডিফল্ট) প্রিফিক্স শেষ = '\ n' রয়েছে যা কনসোলটি ফ্লাশ করতে অনুরোধ করবে।
অফার.শেফার

5
আমি কেবল বিভ্রান্ত হয়েছি, যখন আমি কমাটি সরিয়ে ফেলি এটি প্রত্যাশার মতো ঠিকঠাকভাবে কাজ করে। নতুন লাইনের জন্য কি কোনও বাফার যুক্তি আছে ??
সুনীল লুলা

7

আমার বোঝাপড়া অনুযায়ী, যখনই আমরা প্রিন্ট স্টেটমেন্টগুলি আউটপুট কার্যকর করি তখন বাফারে লেখা হবে। এবং আমরা যখন স্ক্রিনে আউটপুট দেখতে পাব তখন বাফার ফ্লাশ হয়ে যাবে (সাফ হয়ে যাবে)। প্রোগ্রামটি প্রস্থান করলে ডিফল্টরূপে বাফার ফ্লাশ করা হবে। তবে আমরা প্রোগ্রামে "sys.stdout.flush ()" স্টেটমেন্ট ব্যবহার করে বাফার ম্যানুয়ালি ফ্ল্যাশ করতে পারি। নীচের কোডে বাফারটি ফ্লাশ করা হবে যখন আমার মান 5 হয়।

আপনি নীচের কোডটি কার্যকর করে বুঝতে পারবেন।

chiru@online:~$ cat flush.py
import time
import sys

for i in range(10):
    print i
    if i == 5:
        print "Flushing buffer"
        sys.stdout.flush()
    time.sleep(1)

for i in range(10):
    print i,
    if i == 5:
        print "Flushing buffer"
        sys.stdout.flush()
chiru@online:~$ python flush.py 
0 1 2 3 4 5 Flushing buffer
6 7 8 9 0 1 2 3 4 5 Flushing buffer
6 7 8 9

print iআপনার আউটপুট পেতে কমাটি হারিয়েছে
SwimBikeRun

1
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()

1

আমার বোঝার অনুসারে sys.stdout.flush () একটি ফাইল অবজেক্টে এই জাতীয় ডেটা বাফার করা সমস্ত তথ্য বের করে দেয়। স্টাডাউট ব্যবহার করার সময়, টার্মিনালে লেখার আগে ডেটা বাফার মেমরিতে (কিছু সময়ের জন্য বা মেমরিটি পূরণ না হওয়া পর্যন্ত) সংরক্ষণ করা হয়। বাফার খালি করার জন্য ফ্লাশ () বাহিনী ব্যবহার করে এবং বাফারটি ফাঁকা স্থান পাওয়ার আগেও টার্মিনালে লিখুন।

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