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

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

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

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

Ответы [ 9 ]

28 голосов
/ 21 января 2009

да

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()
12 голосов
/ 10 февраля 2014
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

6 голосов
/ 16 ноября 2014

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

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

EDIT: Работает на Windows и на Ubuntu

5 голосов
/ 01 августа 2016

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

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 голосов
/ 27 ноября 2014

У меня просто была эта проблема. Вы по-прежнему можете использовать \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.

2 голосов
/ 22 января 2009

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

import time
for i in range(20):
    print str(i) + '\r',
    time.sleep(1)
1 голос
/ 05 августа 2017

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

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

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

1 голос
/ 03 марта 2012

В 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))

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

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

0 голосов
/ 20 января 2017

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

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

Вот что помогло мне, надеюсь, кому-то еще это пригодится:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...