Python: несколько отпечатков на одной строке - PullRequest
200 голосов
/ 08 апреля 2011

Я хочу запустить скрипт, который в основном показывает такие вещи, как:

Installing XXX...               [DONE]

Теперь, сейчас, я использую print, чтобы напечатать всю строку ПОСЛЕ того, как функция завершилась успешно. Однако теперь я хочу, чтобы он сначала напечатал «Installing xxx ...», а ПОСЛЕ того, как функция запустилась, добавил тег «DONE»; но на той же линии.

Есть идеи?

Ответы [ 14 ]

254 голосов
/ 08 апреля 2011

Вы можете использовать оператор print, чтобы сделать это без импорта sys.

def install_xxx():
   print "Installing XXX...      ",

install_xxx()
print "[DONE]"

Запятая в конце строки print не позволяет print выдать новую строку (обратите внимание, что в конце вывода будет дополнительный пробел).

Решение Python 3
Поскольку вышеописанное не работает в Python 3, вы можете сделать это вместо этого (опять же, без импорта sys):

def install_xxx():
    print("Installing XXX...      ", end="", flush=True)

install_xxx()
print("[DONE]")

Функция печати принимает параметр end, который по умолчанию равен "\n". Установка его в пустую строку не позволяет ему выдавать новую строку в конце строки.

102 голосов
/ 14 марта 2013

Вы можете просто использовать это:

print 'something',
...
print ' else',

и вывод будет

something else

нет необходимости перебивать на import sys. Обратите внимание на запятую в конце.

Python 3 + print("some string", end=""); для удаления вставки новой строки в конце. Читать дальше help(print);

43 голосов
/ 31 марта 2014

Вы должны использовать backspace ' \ r ' или (' \ x08 ') char для возврата на предыдущую позицию в выводе консоли

Python 2+:

import time
import sys

def backspace(n):
    sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back   

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(s)                     # just print
    sys.stdout.flush()                      # needed for flush when using \x08
    backspace(len(s))                       # back n chars    
    time.sleep(0.2)                         # sleep for 200ms

Python 3:

import time   

def backline():        
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print(s, end='')                        # just print and flush
    backline()                              # back to the beginning of line    
    time.sleep(0.2)                         # sleep for 200ms

Этот код будет считать от 0% до 100% в одной строке.Окончательное значение будет:

> python test.py
100%

Дополнительная информация о сбросе в этом случае здесь: Почему операторы печати python, содержащие аргументы 'end =', ведут себя по-разному в циклах while?

43 голосов
/ 08 апреля 2011

Используйте sys.stdout.write('Installing XXX... ') и sys.stdout.write('Done'). Таким образом, вы должны вручную добавить новую строку с помощью "\n", если хотите восстановить функциональность печати. Я думаю, что не стоит использовать проклятия только для этого.

16 голосов
/ 22 июля 2013

Ни один из ответов не сработал для меня, так как все они остановились, пока не встретилась новая строка.Я написал простой помощник:

def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

Чтобы проверить это:

import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

«Привет» сначала распечатается и вылетит на экран перед сном.После этого вы можете использовать стандартную печать.

14 голосов
/ 08 апреля 2011

sys.stdout.write будет печатать без возврата каретки

import sys
sys.stdout.write("installing xxx")
sys.stdout.write(".")

http://en.wikibooks.org/wiki/Python_Programming/Input_and_output#printing_without_commas_or_newlines

8 голосов
/ 15 мая 2018

Этот простой пример напечатает 1-10 в той же строке.

for i in range(1,11):
    print (i, end=" ")
7 голосов
/ 27 февраля 2015

Print имеет необязательный аргумент end, это то, что печатается в конце. По умолчанию используется перевод строки, но вы можете изменить ее на пустую строку. например: print ("hello world!", end = "")

6 голосов
/ 06 ноября 2018

Самое простое:

Python 3

    print(‘\r’+’something to be override’,end=‘’)

Это означает, что он вернет курсор в начало, затем напечатает что-то и закончится в той же строке.Если в цикле он начнет печатать там же, где и начнется.

4 голосов
/ 09 октября 2015

Если вы хотите перезаписать предыдущую строку (а не постоянно добавлять к ней), вы можете объединить \r с print(), в конце оператора print. Например,

from time import sleep

for i in xrange(0, 10):
    print("\r{0}".format(i)),
    sleep(.5)

print("...DONE!")

будет считать от 0 до 9, заменяя старый номер в консоли. "...DONE!" будет напечатан в той же строке, что и последний счетчик, 9.

В вашем случае для OP это позволило бы консоли отображать процент завершения установки в виде «индикатора выполнения», где вы можете определить начальную и конечную позиции символов и обновить маркеры между ними.

print("Installing |XXXXXX              | 30%"),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...