2010-03-26 29 views
24

Tôi đã học được rằng khi thực hiện các lệnh trong Python, tôi nên sử dụng subprocess. Những gì tôi đang cố gắng đạt được là mã hóa một tập tin thông qua ffmpeg và quan sát đầu ra chương trình cho đến khi tập tin được thực hiện. Ffmpeg ghi lại tiến trình thành stderr.Capture subprocess output

Nếu tôi cố gắng một cái gì đó như thế này:

child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE) 
complete = False 
while not complete: 
    stderr = child.communicate() 

    # Get progress 
    print "Progress here later" 
    if child.poll() is not None: 
     complete = True 
    time.sleep(2) 

programm không tiếp tục sau khi gọi child.communicate() và chờ đợi lệnh để hoàn thành. Có cách nào khác để theo dõi đầu ra không?

+0

liên quan: [Python: đọc đầu vào trực tiếp từ subprocess.communicate()] (http://stackoverflow.com/q/2715847/4279) – jfs

Trả lời

26

giao tiếp() chặn cho đến khi quá trình con trở về, vì vậy các phần còn lại trong vòng lặp của bạn sẽ chỉ được thực hiện sau quá trình con đã kết thúc chạy. Đọc từ stderr cũng sẽ chặn, trừ khi bạn đọc ký tự theo ký tự như vậy:

import subprocess 
import sys 
child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE) 
while True: 
    out = child.stderr.read(1) 
    if out == '' and child.poll() != None: 
     break 
    if out != '': 
     sys.stdout.write(out) 
     sys.stdout.flush() 

Điều này sẽ cung cấp cho bạn đầu ra theo thời gian thực. Lấy từ câu trả lời của Nadia here.

+0

tôi không thấy câu trả lời này - câu hỏi của tôi là trùng lặp. cảm ơn bạn. – schneck

+3

trong tập lệnh này, biến 'complete' không sử dụng. –

+0

@JoaoMilasch đã chỉnh sửa, cảm ơn! –

1

.communicate() "Đọc dữ liệu từ stdout và stderr, cho đến khi kết thúc tệp. Hãy đợi cho quá trình chấm dứt".

Thay vào đó, bạn sẽ có thể đọc từ child.stderr như một tệp thông thường.