Python - переписать несколько строк в консоли - PullRequest
30 голосов
/ 27 июля 2011

Я знаю, что можно последовательно переписать последнюю строку, отображаемую в терминале, с помощью "\ r", но у меня возникают проблемы с поиском способа вернуться назад и отредактировать предыдущие строки, напечатанные в консоли.

То, что я хотел бы сделать, это перепечатать несколько строк для текстовой RPG, однако один из друзей также поинтересовался этим для приложения, в котором одна строка была посвящена индикатору выполнения, а другая - описывала загрузку.

т.е. консоль напечатает:

Перемещение файла: NameOfFile.txt
Общий прогресс: [########] 40%

, а затем обновите соответствующим образом (в обе строки) во время работы программы.

Ответы [ 3 ]

40 голосов
/ 27 июля 2011

В Unix используйте модуль curses .

В Windows есть несколько опций:

Простой пример использования curses (явсего проклятий n00b):

import curses
import time

def report_progress(filename, progress):
    """progress: 0-10"""
    stdscr.addstr(0, 0, "Moving file: {0}".format(filename))
    stdscr.addstr(1, 0, "Total progress: [{1:10}] {0}%".format(progress * 10, "#" * progress))
    stdscr.refresh()

if __name__ == "__main__":
    stdscr = curses.initscr()
    curses.noecho()
    curses.cbreak()

    try:
        for i in range(10):
            report_progress("file_{0}.txt".format(i), i+1)
            time.sleep(0.5)
    finally:
        curses.echo()
        curses.nocbreak()
        curses.endwin()
4 голосов
/ 22 декабря 2015

В конечном счете, если вы хотите манипулировать экраном, вам нужно использовать базовые библиотеки ОС, которые обычно будут:

  • curses (или базовые управляющие коды терминала, отслеживаемые базой данных terminfo / termcap) в Linux или OSX
  • API консоли win32 в Windows.

Ответ от @codeape уже дает вам несколько вариантов, если вы не против подключиться к одной ОС или хотите установить сторонние библиотеки в Windows.

Однако, если вы хотите кроссплатформенное решение, которое вы можете просто установить pip, вы можете использовать asciimatics . В рамках разработки этого пакета мне пришлось устранить различия между средами, чтобы обеспечить единый API, который работает в Linux, OSX и Windows.

Для индикаторов выполнения вы можете использовать объект BarChart, как показано в этой демонстрации с использованием этого кода .

3 голосов
/ 10 ноября 2016

Здесь представлен модуль Python для Python 2/3, который может просто решить такую ​​ситуацию с помощью нескольких строк кода: D

reprint - простой модуль для печати на Python 2/3и обновить содержимое многострочного вывода в терминале

Вы можете просто обработать этот экземпляр output как обычный dict или list (зависит от того, какой режим вы используете).Когда вы изменяете это содержимое в экземпляре output, вывод в терминале будет автоматически обновляться: D

Для вашей потребности, вот код:

from reprint import output
import time

if __name__ == "__main__":
    with output(output_type='dict') as output_lines:
        for i in range(10):
            output_lines['Moving file'] = "File_{}".format(i)
            for progress in range(100):
                output_lines['Total Progress'] = "[{done}{padding}] {percent}%".format(
                    done = "#" * int(progress/10),
                    padding = " " * (10 - int(progress/10)),
                    percent = progress
                    )
                time.sleep(0.05)
...