Как я могу напечатать текущую строку в приложении командной строки?

В Unix я могу либо использовать \r (возврат каретки), либо \b (backspace) для печати текста, уже видимого в оболочке (т.е. снова перезаписать текущую строку).

Можно ли добиться такого же эффекта в командной строке Windows из Python script?

Я пробовал модуль curses, но он, похоже, не доступен в Windows.

Ответ 1

да

import sys
import time

def restart_line():
    sys.stdout.write('\r')
    sys.stdout.flush()

sys.stdout.write('some data')
sys.stdout.flush()
time.sleep(2) # wait 2 seconds...
restart_line()
sys.stdout.write('other different data')
sys.stdout.flush()

Ответ 3

У меня была эта проблема. Вы все равно можете использовать \r, даже в командной строке Windows, однако он возвращает вас только к предыдущей строке (\n).

Если вы сделаете что-то вроде этого:

cnt = 0
print str(cnt)
while True:
    cnt += 1
    print "\r" + str(cnt)

Вы получите:

0
1
2
3
4
5
...

Это потому, что \r возвращается только к последней строке. Поскольку вы уже написали символ новой строки с последним оператором печати, ваш курсор переходит от начала новой пустой строки к началу той же новой пустой строки.

Чтобы проиллюстрировать, после того, как вы напечатаете первый 0, ваш курсор будет здесь:

0
| # <-- Cursor

Когда вы \r, вы переходите к началу строки. Но вы уже в начале линии.

Исправление состоит в том, чтобы избежать печати символа \n, поэтому ваш курсор находится на одной строке, а \r перезаписывает текст правильно. Вы можете сделать это с помощью print 'text',. Запятая предотвращает печать символа новой строки.

cnt = 0
print str(cnt),
while True:
    cnt += 1
    print "\r" + str(cnt),

Теперь он будет правильно переписывать строки.

Обратите внимание, что это Python 2.7, следовательно, операторы print.

Ответ 4

простой метод:)

import sys
from time import sleep
import os

#print("\033[y coordinate;[x coordinateH Hello")
os.system('cls')
sleep(0.2)
print("\033[1;1H[]")
sleep(0.2)
print("\033[1;1H  []")
sleep(0.2)
print("\033[1;1H    []")
sleep(0.2)
print("\033[1;1H      []")
sleep(0.2)
print("\033[1;1H        []")
sleep(0.2)
print("\033[1;1H      []")
sleep(0.2)
print("\033[1;1H    []")
sleep(0.2)
print("\033[1;1H  []")
sleep(0.2)
print("\033[1;1H[]")
sleep(0.2)

Ответ 5

Я знаю, что это старо, но я хотел сообщить свою версию (она работает на моем ПК в cmd, но не в режиме ожидания), чтобы переопределить строку в Python 3:

>>> from time import sleep
>>> for i in range(400):
>>>     print("\r" + str(i), end="")
>>>     sleep(0.5)

EDIT: Он работает в Windows и на Ubuntu

Ответ 6

Простой способ, если вы просто хотите обновить предыдущую строку:

import time
for i in range(20):
    print str(i) + '\r',
    time.sleep(1)

Ответ 7

В Windows (python 3) он работает (не используя напрямую stdout):

import sys

for i in reversed(range(0,20)):
  time.sleep(0.1)
  if(i == 19):
    print(str(i), end='', file=sys.stdout)
  else:
    print("\r{0:{width}".format(str(i), width = w, fill = ' ', align = 'right'), end='', file=sys.stdout)
  sys.stdout.flush()
  w = len(str(i))

Эта же строка обновляется каждый раз, когда вызывается функция печати. ​​

Этот алгоритм может быть улучшен, но он публикуется, чтобы показать, что вы можете сделать. Вы можете изменить метод в соответствии с вашими потребностями.

Ответ 8

Самый простой способ - использовать два \r - один в начале и один в конце

for i in range(10000):
    print('\r'+str(round(i*100/10000))+'%  Complete\r'),

Это будет довольно быстро

Ответ 9

Спасибо за все полезные ответы здесь, ребята. Мне это нужно:)

Я нашел nosklo answer особенно полезным, но мне нужно что-то, полностью содержащееся в функции, передав желаемый результат в качестве параметра. Кроме того, мне не нужен таймер, так как я хотел, чтобы печать выполнялась после определенного события).

Вот что помогло, я надеюсь, что кто-то найдет это полезным:

import sys

def replace_cmd_line(output):
    """Replace the last command line output with the given output."""
    sys.stdout.write(output)
    sys.stdout.flush()
    sys.stdout.write('\r')
    sys.stdout.flush()