Я работаю над ОС Raspberry Pi и создаю этот скрипт Python для запуска команды и захвата ее вывода. Он отлично работает для команд, которые выводят текст последовательно. Но когда я пытаюсь запустить команды, использующие динамические обновления, такие как apt-get update, которые отображают процент выполнения, он не может его зафиксировать. Знаете ли вы, как я могу воспроизвести точное поведение отображения команды, как оно показано в реальном окне терминала? Дело в том, что я на самом деле не использую print(line.strip()), вместо этого я отправляю данные через сетевой сокет на другом компьютере и там показываю их. На другом компьютере я знаю, как распечатать данные в окнах виртуального терминала, но я не знаю, как мне прочитать управляющие символы (?) и как их интерпретировать...? Мне не нужно, чтобы он работал со сложными программами с меню или другими вещами, просто такие простые команды показывают некоторый прогресс, как это делает apt-get update...
import subprocess
import select
import os
os.environ['PYTHONUNBUFFERED'] = '1'
process = subprocess.Popen(['apt-get', 'update'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
while True:
line = process.stdout.readline()
if not line: break
print(line.strip())
process.wait()
Обновление1:
Я создал еще один скрипт Python, который печатает число, а затем перемещает курсор в ту же позицию и снова печатает...
import time
for i in range(10):
print(i)
print('\033[F', end='')
time.sleep(1)
А затем, когда я запускаю этот сценарий как подпроцесс и читаю его выходные данные в режиме необработанных байтов, я получаю те escape-символы, которые я отправил... Но если я попробую с apt-get update Команда я получаю только текст, а не escape-символы для перемещения курсора для отображения в том же месте, где выполняется чтение пакета.
import subprocess
import select
import os
os.environ['PYTHONUNBUFFERED'] = '1'
process = subprocess.Popen(['python3', 'cursor.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while True:
ready = select.select([process.stdout], [], [], 0.1)[0]
if not ready: continue
B = process.stdout.read(1)
if len(B) < 1: break
print(hex(B[0]))
process.wait()
Подробнее здесь: https://stackoverflow.com/questions/784 ... -a-command