2016-06-20 7 views
0

So verwende ich Handbremse und Python, um Videos basierend auf einem Zeitplan zu kodieren. Ich muss den Fortschritt überwachen, weil ich damit die Codierungszeit einschätze. Dann kann ich es meinem Scheduler anpassen.Python Überwachung Fortschritt der Handbremse

Ich habe ein Problem, die ETA und% vollständig aus dem Prozess zu bekommen. Hier ist, was ich bis jetzt habe

profile = ["HandBrakeCLI","-i",input,"-o","output","-e","x264"] 
cp = subprocess.Popen(profile, stderr=subprocess.PIPE, bufsize=1) 
for line in iter(cp.stderr.readline, b''): 

    # regex match for % complete and ETA 
    matches = re.match(r'.*(\d+\.\d+)\s%.*ETA\s(\d+)h(\d+)m(\d+)s', line.decode('utf-8')) 

    if matches: 
    print(matches.group()) 

    print(line), 

cp.stderr.close() 
cp.wait() 

Es stimmt nicht überein, in der Tat bin ich nicht ganz sicher, was vor sich geht. Wenn ich mein Skript ausführen, sehe ich die ETA und% fertig Ausdruck

Encoding: task 1 of 1, 1.19 % (45.57 fps, avg 62.74 fps, ETA 00h08m01s) 

Ich habe versucht, stdout verwenden, aber es funktioniert auch nicht.

+0

Ich bin ziemlich sicher, das Problem ist, dass Handbrake CLI keine neuen zusätzlichen Zeilen jedes Mal, wenn der Prozess ein bisschen fortgeschritten ist, eher die bestehende Zeile ändert. Versuchen Sie, die Zeile unmittelbar nach 'for line in inter..' zu drucken und sehen Sie, was Sie tatsächlich erhalten. – advance512

+0

würde mir das nicht geben die Ausgabe nach der For-Schleife beendet? also wenn der Prozess beendet ist? Ich möchte die Informationen erhalten, während der Prozess läuft. –

+0

Zuerst iterieren Sie über stderr, vielleicht müssen Sie über stdout iterieren. Zweitens denke ich, dass cp.stderr.readline vollständige Zeilen aus dem Subprozess selbst zurückgeben würde, nicht eine einzige wiederholt aktualisierte Zeile. Ich würde die letzte Zeile nach dem 'Handbreak'-Prozess drucken, um zu sehen, wie es aussieht. Und, wie ich schon sagte, würde ich jede Zeile in der for-Schleife drucken, um zu verstehen, was ich tatsächlich erhalte. – advance512

Antwort

0

Sie müssen von stdout, nicht stderr lesen.

profile = ["HandBrakeCLI","-i",input,"-o","output","-e","x264"] 
cp = subprocess.Popen(profile, stderr=subprocess.PIPE, strout=subprocess.PIPE, bufsize=1) 
for line in iter(cp.stdout.readline, b''): 

    # regex match for % complete and ETA 
    matches = re.match(r'.*(\d+\.\d+)\s%.*ETA\s(\d+)h(\d+)m(\d+)s', line.decode('utf-8')) 

    if matches: 
    print(matches.group()) 

    print(line), 

cp.stderr.close() 
cp.stdout.close() 
cp.wait() 

einen Fortschritt Wrapper (mit clint.textui.progress.Bar) und Byte für Byte gelesen (funktioniert für mich):

profile = ["HandBrakeCLI","-i",input,"-o","output","-e","x264"] 
cp = subprocess.Popen(profile, stderr=subprocess.PIPE, strout=subprocess.PIPE, close_fds=True) 
bar = Bar(label="Encoding %s" % input, width=30, expected_size=10000, every=1) 
bar.show(0) 

line = "" 
c = 0 

while True:  
    nl = cp.stdout.read(1) 
    if nl == '' and cp.poll() is not None: 
    break # Aborted, no characters available, process died. 
    if nl == "\n": 
    line = "" 
    elif nl == "\r": 
    # regex match for % complete and ETA, assuming the regex is ok. 
    matches = re.match(r'.*(\d+\.\d+)\s%.*ETA\s(\d+)h(\d+)m(\d+)s', line.decode('utf-8')) 

    if matches: 
     print(matches.group()) 
     # do something 
    line = "" 
    else: 
    line += nl 

error = cp.stderr.read() 
success = "Encode done!" in error 

Haben Sie den Code nicht testen, umschrieb er die passen Thread initial post.

Hoffe, dass hilft.