मैं एक कमांड लाइन प्रोग्राम (svnadmin सत्यापित) के लिए एक आवरण स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो ऑपरेशन के लिए एक अच्छा प्रगति संकेतक प्रदर्शित करेगा। यह मुझे आउटपुट के रूप में जल्द ही लिपटे प्रोग्राम से आउटपुट की प्रत्येक पंक्ति को देखने में सक्षम होने की आवश्यकता है।
मुझे लगा कि मैं इस कार्यक्रम का उपयोग subprocess.Popen
, उपयोग stdout=PIPE
, फिर प्रत्येक पंक्ति को पढ़ूंगा क्योंकि यह आया था और उसी के अनुसार कार्य करता है। हालाँकि, जब मैंने निम्नलिखित कोड चलाया, तो आउटपुट कहीं-कहीं बफ़र करने लगा, जिससे यह 332 के माध्यम से दो हिस्सों, 1 पंक्ति में दिखाई दिया, फिर 439 (आउटपुट की अंतिम पंक्ति) के माध्यम से 333
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 (कोई बफर) के लिए bufsize सेट करने का प्रयास किया, लेकिन लाइनों को वितरित किए जाने के तरीके को बदलने के लिए न तो मूल्य प्रतीत होता है।
इस बिंदु पर मैं तिनके के लिए पकड़ना शुरू कर रहा था, इसलिए मैंने निम्नलिखित आउटपुट लूप लिखा:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
लेकिन एक ही परिणाम मिला।
क्या सबप्रोसेस का उपयोग करके निष्पादित प्रोग्राम का 'रियलटाइम' प्रोग्राम आउटपुट प्राप्त करना संभव है? क्या पायथन में कुछ अन्य विकल्प है जो आगे-संगत (नहीं exec*
) है?
sydout=PIPE
मूल प्रक्रिया को दरकिनार करते हुए उपप्रोसेस को सीधे अपने कंसोल पर लिखने की कोशिश की है?