আমার পাইথন স্ক্রিপ্টটি একটি লিনাক্স ইউটিলিটি কল করতে সাবপ্রসেস ব্যবহার করে যা খুব গোলমাল। আমি সমস্ত আউটপুট একটি লগ ফাইলে সংরক্ষণ করতে এবং এটির কিছু ব্যবহারকারীর কাছে প্রদর্শন করতে চাই। আমি ভেবেছিলাম নিম্নলিখিতটি কাজ করবে তবে ইউটিলিটি উল্লেখযোগ্য পরিমাণে আউটপুট তৈরি না করা পর্যন্ত আউটপুটটি আমার অ্যাপ্লিকেশনটিতে প্রদর্শিত হবে না।
#fake_utility.py, just generates lots of output over time
import time
i = 0
while True:
print hex(i)*512
i += 1
time.sleep(0.5)
#filters output
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
for line in proc.stdout:
#the real code does filtering here
print "test:", line.rstrip()
আমি প্রকৃতপক্ষে যে আচরণটি করতে চাই তা হ'ল ফিল্টার স্ক্রিপ্টটি প্রতিটি লাইনটি প্রিন্ট করে যেমন এটি সাবপ্রসেস থেকে প্রাপ্ত হয়। বাছাইয়ের মতো tee
পাইথন কোড সহ যা করে।
আমি কী মিস করছি? এটা কি সম্ভব?
হালনাগাদ:
যদি sys.stdout.flush()
নকল_ইউটিলিটি.পি-তে যুক্ত করা হয়, কোডটি পাইথন ৩.১ এ পছন্দসই আচরণ করে। আমি পাইথন ২.6 ব্যবহার করছি। আপনি ভাববেন যে proc.stdout.xreadlines()
ব্যবহারটি পাই 3 কে হিসাবে একই কাজ করবে, তবে তা হয় না।
আপডেট 2:
এখানে সর্বনিম্ন কার্যকারী কোড।
#fake_utility.py, just generates lots of output over time
import sys, time
for i in range(10):
print i
sys.stdout.flush()
time.sleep(0.5)
#display out put line by line
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
#works in python 3.0+
#for line in proc.stdout:
for line in iter(proc.stdout.readline,''):
print line.rstrip()
print line,
পরিবর্তে ব্যবহার করতে পারেনprint line.rstrip()
(দ্রষ্টব্য: শেষে কমা)।