удаление нескольких строк в выводе команды печатает символы управления ASCII - PullRequest
1 голос
/ 12 марта 2020

Используя Python 3.7, я пытаюсь переписать несколько строк вывода в командном окне (Windows 10 - cmd). Для одной строки это просто, так как я могу просто напечатать строку снова с помощью возврата каретки.

print('\r only once',end='')
print('\r only once',end='')

Однако это не будет работать, если есть несколько строк. Теперь я попытался сделать это, используя ascii control charachters. Это обычно делается в al oop, чтобы показать прогресс, но минимальный пример -

import os
import sys
import time

print("upper")  #moves back in line
print("lower")  #moves back in line

#time.sleep(1)
#os.system("pause")

sys.stdout.write("\033[K")  #clear line 
sys.stdout.write("\033[F")  #back to previous line
sys.stdout.write("\033[K")  #clear line 
sys.stdout.write("\033[F")  #back to previous line
sys.stdout.write("\033[K")  #clear line
sys.stdout.write("\033[F")  #back to previous line

print("new upper")  #moves back in line
print("new lower")  #moves back in line

Если он работает так или с time.sleep(1) без комментария, вывод будет:

upper lower [K[F[K[F[K[Fnew upper new lower

Если os.system("pause") (только windows) не закомментирован, вывод верен

new upper new upper

Кто-нибудь знает, почему os.system("pause") меняет поведение из управляющих символов или как их вообще включить? В качестве альтернативы, есть ли у кого-нибудь другая (или, может быть, даже лучше) идея о том, как заменить многострочный вывод с python?

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

@ Тайлер ответ работает. Однако я только что узнал, что если у вас есть Win 10 после ежегодного обновления (версия 1607, 02.08.2016, которая, вероятно, к настоящему времени имеется у большинства пользователей Win 10), вы можете включить встроенную поддержку cmd.exe, добавив или изменив VirtualTerminalLevel реестр, как показано здесь

0 голосов
/ 12 марта 2020

Вы пытаетесь использовать escape-последовательности ANSI, которые windows не поддерживает, по крайней мере по умолчанию.

Я слышал, что вы можете использовать Colorama для включения после установки они делают следующее в начале программы:

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