Динамическая терминальная печать с питоном - PullRequest
33 голосов
/ 23 января 2010

В некоторых приложениях, таких как hellanzb, есть способ печати на терминал с появлением динамически обновляемых данных, например top ().

Какой лучший метод в Python для этого? Я прочитал о регистрации и проклятий, но не знаю, что использовать. Я создаю переопределение вершины. Если у вас есть другие предложения, я открыт для них.

Ответы [ 7 ]

51 голосов
/ 23 января 2010

Самый простой способ, если вам когда-либо понадобится обновить только одну строку (например, создать индикатор выполнения), это использовать '\r' (возврат каретки) и sys.stdout:

import sys
import time

for i in range(10):
    sys.stdout.write("\r{0}>".format("="*i))
    sys.stdout.flush()
    time.sleep(0.5)

Если вам нужен надлежащий интерфейс консоли, поддерживающий перемещение указателя и т. Д., Используйте модуль curses из стандартной библиотеки:

import time
import curses

def pbar(window):
    for i in range(10):
        window.addstr(10, 10, "[" + ("=" * i) + ">" + (" " * (10 - i )) + "]")
        window.refresh()
        time.sleep(0.5)

curses.wrapper(pbar)

Настоятельно рекомендуется использовать функцию curses.wrapper для вызова вашей основной функции, она позаботится о том, чтобы очистить терминал в случае ошибки, чтобы она не была в неработоспособном состоянии впоследствии.

Если вы создадите более сложный интерфейс, вы можете создать несколько окон для разных частей экрана, поля ввода текста и поддержку мыши.

13 голосов
/ 09 июня 2016

Как уже говорилось в большинстве ответов, у вас действительно мало возможностей, кроме как использовать ncurses. Но что, если вы не работаете в Linux или хотите что-то более высокоуровневое для создания пользовательского интерфейса терминала?

Лично я нашел отсутствие современного кроссплатформенного API терминала в Python разочаровывающим, поэтому написал asciimatics , чтобы решить эту проблему. Он не только предоставляет простой кроссплатформенный API , но также предоставляет множество абстракций более высокого уровня для виджетов и анимаций пользовательского интерфейса , которые можно легко использовать для создания топ-подобных пользовательский интерфейс.

3 голосов
/ 23 января 2010

Звучит как работа для curses. Это наиболее часто используемая библиотека для текстового режима и управления экраном. В Python очень хорошая поддержка проклятий, включая поддержку панелей:

2 голосов
/ 08 ноября 2017

Я взломал этот скрипт, используя curses. Это действительно специальное решение, которое я сделал для удовольствия. Он не поддерживает прокрутку, но я думаю, что это хорошая отправная точка, если вы хотите построить монитор для оперативного обновления с несколькими строками на терминале.

https://gist.github.com/tpandit/b2bc4f434ee7f5fd890e095e79283aec

0 голосов
/ 29 ноября 2017

Отправка вывода на терминал с помощью команды print () может быть выполнена без прокрутки, если вы используете атрибут «end».

По умолчанию end = '\ n', это новая строка.

Чтобы отключить прокрутку и перезаписать всю предыдущую строку, вы можете использовать escape RETURN, который является '\ r'.

Если вы хотите переписать только последние четыре символа, вы можете использовать несколько пробелов.

print(value, "_of_", total, end='\r')

Примечание Это работает для стандартного системного терминала. Эмулятор терминала в некоторых инструментах, таких как IDLE, имеет ошибку, и '\ r' не работает должным образом, вывод просто объединяется с некоторым непечатным символом между ними.

БОНУСНАЯ ИНФОРМАЦИЯ ДЛЯ ПЕЧАТИ () В приведенном выше примере пробелы с каждой стороны от "of" предназначены для обеспечения пробела между моими значениями и словом "of". Тем не менее, по умолчанию разделителем print () является "" (пробел), поэтому мы получаем пробел между значением и подчеркиванием "_of_".

>> print (value, "_of_", total, end='\r')
8 _of_ 17

Атрибут sepparator, sep, может использоваться для установки символов между печатными элементами. В моем примере я заменим его на пустую строку (''), чтобы мой вывод соответствовал моим потребностям.

>> print (value, "_of_", total, sep='', end='\r')
8_of_17
0 голосов
/ 23 января 2010
[ignacio@localhost ~]$ ldd /usr/bin/top | grep curses
        libncursesw.so.5 => /lib64/libncursesw.so.5 (0x0000003ae1400000)

curses.

0 голосов
/ 23 января 2010

Когда я делаю это в сценариях оболочки в Unix, я обычно использую программу clearВы можете использовать модуль подпроцесса Python для его выполнения.По крайней мере, он быстро даст вам то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...