İşlem için güzel bir ilerleme göstergesi gösterecek bir komut satırı programı (svnadmin doğrulaması) için bir sarmalayıcı komut dosyası yazmaya çalışıyorum. Bu, çıktı alınır alınmaz sarmalanmış programdan her çıktı satırını görebilmemi gerektiriyor.
Programı kullanarak çalıştıracağımı subprocess.Popen
, kullanacağımı stdout=PIPE
, sonra gelen her satırı okuyup ona göre hareket edeceğimi düşündüm . Bununla birlikte, aşağıdaki kodu çalıştırdığımda, çıktı bir yerde arabelleğe alınmış gibi görünüyordu, bu da iki parça halinde görünmesine neden oldu: 1'den 332'ye, sonra 333'ten 439'a (son çıktı satırı)
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', '')
Alt süreçle ilgili belgelere biraz baktıktan sonra, bufsize
parametresini keşfettim Popen
, bu yüzden bufsize'yi 1 (her satırı tampon) ve 0 (tampon yok) olarak ayarlamayı denedim, ancak her iki değer de satırların teslim edilme şeklini değiştirmedi.
Bu noktada pipetleri kavramaya başladım, bu yüzden aşağıdaki çıktı döngüsünü yazdım:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
ama aynı sonucu aldı.
Alt süreç kullanılarak çalıştırılan bir programın 'gerçek zamanlı' program çıktısını almak mümkün müdür? Python'da ileriye uyumlu (olmayan exec*
) başka bir seçenek var mı ?
sydout=PIPE
Alt işlemin ana işlemi atlayarak doğrudan konsolunuza yazması için atlamayı denediniz mi?