Как я могу напечатать текущую строку в приложении командной строки?
В 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()
Ответ 2
import sys
import time
for i in range(10):
print '\r', # print is Ok, and comma is needed.
time.sleep(0.3)
print i,
sys.stdout.flush() # flush is needed.
И если на IPython-ноутбуке, вот так:
import time
from IPython.display import clear_output
for i in range(10):
time.sleep(0.25)
print(i)
clear_output(wait=True)
http://nbviewer.ipython.org/github/ipython/ipython/blob/master/examples/notebooks/Animations%20Using%20clear_output.ipynb
Ответ 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()