Saya mencoba menulis skrip wrapper untuk program baris perintah (svnadmin memverifikasi) yang akan menampilkan indikator kemajuan yang bagus untuk operasi. Ini mengharuskan saya untuk dapat melihat setiap baris output dari program yang dibungkus segera setelah itu adalah output.
Saya pikir saya hanya akan menjalankan program menggunakan subprocess.Popen
, menggunakan stdout=PIPE
, kemudian membaca setiap baris ketika masuk dan bertindak sesuai. Namun, ketika saya menjalankan kode berikut, output tampaknya buffer di suatu tempat, menyebabkannya muncul dalam dua potongan, baris 1 hingga 332, kemudian 333 hingga 439 (baris terakhir output)
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', '')
Setelah melihat dokumentasi pada subproses sedikit, saya menemukan bufsize
parameter untuk Popen
, jadi saya mencoba menetapkan bufsize ke 1 (buffer setiap baris) dan 0 (tidak ada buffer), tetapi tidak ada nilai yang tampaknya mengubah cara jalur dikirim.
Pada titik ini saya mulai memahami sedotan, jadi saya menulis loop keluaran berikut:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
tetapi mendapat hasil yang sama.
Apakah mungkin untuk mendapatkan output program 'realtime' dari suatu program yang dieksekusi menggunakan subproses? Apakah ada opsi lain di Python yang kompatibel dengan maju (tidak exec*
)?
sydout=PIPE
sehingga proses menulis langsung ke konsol Anda, melewati proses induk?