2016-06-20 13 views
0

Итак, я использую ручной тормоз и питон для кодирования видео по расписанию. Мне нужно отслеживать прогресс, потому что я использую его для оценки времени кодирования. Тогда я могу поместить его в свой планировщик.Python отслеживает ход Handbrake

У меня возникла проблема с получением ETA и% от процесса. Вот что у меня есть до сих пор

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() 

Это не соответствует действительности, на самом деле я не совсем уверен, что происходит. Когда я бег моего сценария, я вижу ETA и% полной распечатку

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

Я попытался с помощью стандартного вывода, но он не работает.

+0

Я уверен, что проблема в том, что CLI Handbrake не выводит новые дополнительные строки каждый раз, когда процесс немного прогрессирует, а изменяет существующую строку. Попробуйте распечатать строку сразу после 'for line in inter..' и посмотреть, что она на самом деле дает вам. – advance512

+0

не дал бы мне выход после выхода цикла for? поэтому, когда процесс завершен? Я хотел бы получить информацию в процессе. –

+0

Прежде всего, вы повторяете stderr, возможно, вам нужно перебирать stdout. Во-вторых, я думаю, что cp.stderr.readline вернет полные строки из самого подпроцесса, а не одну повторно обновленную строку. Я бы напечатал последнюю строку после завершения процесса 'handbreak', чтобы посмотреть, как это выглядит. И, как я уже говорил, я печатал каждую строку в цикле for, чтобы понять, что я на самом деле получаю. – advance512

ответ

0

Вам необходимо прочитать из stdout, а не stderr.

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() 

Использование прогресса обертку (с использованием clint.textui.progress.Bar) и читать побайтно (работает для меня):

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 

Не проверить код, переписал его, чтобы соответствовать начальный пост.

Надеюсь, что это поможет.