Я работаю над ОС 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
Как реплицировать динамический стандартный вывод команды? [дубликат] ⇐ Linux
1715706056
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()
[b]Обновление1:[/b]
Я создал еще один скрипт 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()
Подробнее здесь: [url]https://stackoverflow.com/questions/78478148/how-to-replicate-the-dynamic-stdout-of-a-command[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия