আমি একটি কমান্ড লাইন প্রোগ্রামের জন্য একটি র্যাপার স্ক্রিপ্ট লেখার চেষ্টা করছি (এসএনএইডমিন যাচাই করুন) যা অপারেশনের জন্য একটি দুর্দান্ত অগ্রগতি সূচক প্রদর্শন করবে। এটির আউটপুট হওয়ার সাথে সাথে মোড়ানো প্রোগ্রাম থেকে প্রতিটি লাইন আউটপুট দেখতে আমার সক্ষম হওয়া প্রয়োজন।
আমি অনুভব করেছি যে আমি কেবল প্রোগ্রামটি ব্যবহার করে ব্যবহার করব subprocess.Popen
, ব্যবহার করব stdout=PIPE
, তারপরে প্রতিটি লাইনটি আসার সাথে সাথে পড়তে হবে এবং সে অনুযায়ী কাজ করব। যাইহোক, যখন আমি নিম্নলিখিত কোডটি চালিয়েছি, আউটপুটটি কোথাও বাফার হয়ে দেখা দিয়েছে, যার ফলে এটি দুটি খণ্ডে দেখা যাচ্ছে, লাইন 1 থেকে 332 পর্যন্ত, তারপরে 333 থেকে 439 (আউটপুটের শেষ লাইন)
from subprocess import Popen, PIPE, STDOUT
p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE,
stderr = STDOUT, shell = True)
for line in p.stdout:
print line.replace('\n', '')
সাবপ্রসেসে ডকুমেন্টেশনটি কিছুটা দেখার পরে আমি bufsize
প্যারামিটারটি আবিষ্কার করেছিলাম Popen
, তাই আমি বুফসাইজটি 1 (প্রতিটি লাইন বাফার) এবং 0 (কোনও বাফার) এ সেট করার চেষ্টা করেছি, তবে কোনও মানই লাইনগুলি সরবরাহ করার পদ্ধতি পরিবর্তন করার মতো মনে হয়নি।
এই মুহুর্তে আমি স্ট্রগুলি আঁকতে শুরু করেছি, সুতরাং আমি নিম্নলিখিত আউটপুট লুপটি লিখেছিলাম:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
তবে একই ফল পেয়েছে।
সাবপ্রসেস ব্যবহার করে কোন প্রোগ্রামের 'রিয়েলটাইম' প্রোগ্রাম আউটপুট পাওয়া সম্ভব? পাইথনে আরও কিছু অপশন রয়েছে যা ফরোয়ার্ড-সামঞ্জস্যপূর্ণ (নয় exec*
)?
sydout=PIPE
প্যারেন্ট প্রসেসটি বাইপাস করে সাব-প্রসেসগুলি সরাসরি আপনার কনসোলটিতে লিখেছেন তাই আপনি কী বাদ দেওয়ার চেষ্টা করেছেন ?