Я пытаюсь прочитать последнюю строку из команды типа «apt-get download firefox». Обычно выход будет какПоследняя небуферизованная строка не может быть прочитана
Get:1 http://archive.ubuntu.com/ubuntu/ utopic/main firefox amd64 32.0+build1-0ubuntu2 [34.9 MB]
2% [1 firefox 646 kB/34.9 MB 2%]
с последней строкой постоянно обновлять (не писать новую строку, пока она не достигнет 100%). Моя цель - теперь прочитать прогресс в реальном времени. Вот мой текущий код примера:
#!/usr/bin/python3 -u
# coding=utf-8
import subprocess, sys
pipe = subprocess.Popen(['apt-get', 'download', 'firefox'], 0, stderr = subprocess.PIPE, stdout = subprocess.PIPE)
while True:
content = pipe.stdout.read(1).decode()
if content == '':
break
sys.stdout.write(content)
sys.stdout.flush()
pipe.wait()
Я отключил буферизацию вывода для вызова подпроцесса, а также для дискретного выхода для процесса Python (с -u аргументом). Но я получаю только первую строку, но не прогресс второй линии. Кто-нибудь знает, как я могу это достичь?
вам нужны либо потоки, либо async.io, чтобы читать * оба * потоки одновременно. См. [Отображение вывода подпроцесса в stdout и перенаправление его] (http://stackoverflow.com/q/25750468/4279). – jfs
Вам нужно захватить 'Get: 1 http: // ..' line (stdout?), Или это достаточно, если вы получите только последнюю строку прогресса (stderr?)? – jfs
Что нужно проверить: 1. «apt-get' пишет только в stdout/stderr или может [писать на терминал напрямую] (http://stackoverflow.com/q/20980965/4279)? 2. Использует ли [block-buffering, если stdout является каналом] (http://stackoverflow.com/q/20503671/4279)? 3. Показывает ли строка прогресса, если stderr перенаправляется на трубу? – jfs