Как реплицировать динамический стандартный вывод команды? [дубликат]Linux

Ответить
Anonymous
 Как реплицировать динамический стандартный вывод команды? [дубликат]

Сообщение Anonymous »

Я работаю над ОС 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»