Я хочу запустить script, который в основном показывает такие вещи, как:
Installing XXX... [DONE]
Теперь, на данный момент, я использую печать для печати всей строки ПОСЛЕ завершения функции. Однако теперь я хочу, чтобы он сначала напечатал "Установка xxx..." и ПОСЛЕ запускаемой функции, чтобы добавить тег "DONE"; но в той же строке.
Любые идеи?
Ответ 1
Вы можете использовать оператор 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"
. Установка его в пустую строку не позволяет ему выдавать новую строку в конце строки.
Ответ 2
Вы можете просто использовать это:
print 'something',
...
print ' else',
и выход будет
something else
нет необходимости переполнять import sys
. Обратите внимание на символ запятой в конце.
Python 3 +
print("some string", end="");
, чтобы удалить вставку новой строки. Подробнее читайте help(print);
Ответ 3
Используйте sys.stdout.write('Installing XXX... ')
и sys.stdout.write('Done')
. Таким образом, вы должны добавить новую строку вручную с помощью "\n"
, если хотите воссоздать функциональность печати. Я думаю, что для этого может быть необязательно использовать проклятия.
Ответ 4
Вы должны использовать 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?
Ответ 5
Ни один из ответов не работал у меня, так как все они останавливались до появления новой строки. Я написал простого помощника:
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')
"привет" сначала выйдет и выйдет на экран перед сном. После этого вы можете использовать стандартную печать.
Ответ 6
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
Ответ 7
Этот простой пример напечатает 1-10 в той же строке.
for i in range(1,11):
print (i, end=" ")
Ответ 8
Печать имеет необязательный конечный аргумент, это то, что напечатано в конце.
По умолчанию используется новая строка, но вы можете изменить ее на пустую строку. например: print ( "hello world!", end = "")
Ответ 9
Самое простое:
Python 3
print(‘\r+something to be override,end=‘)
Это означает, что он вернет курсор в начало, затем напечатает что-то и закончится в той же строке. Если в цикле он начнет печатать там же, где и начнется.
Ответ 10
Если вы хотите перезаписать предыдущую строку (а не постоянно добавлять к ней), вы можете объединить \r
с 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%"),
Ответ 11
Вот 2.7-совместимая версия, полученная из версии 3.0 от @Vadim-Zin4uk:
Python 2
import time
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
print '{0}\r'.format(s), # just print and flush
time.sleep(0.2)
В этом отношении предлагаемое решение 3.0 выглядит несколько раздутым. Например, метод backspace не использует целочисленный аргумент и, вероятно, может быть полностью исключен.
Python 3
import time
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
print('{0}\r'.format(s), end='') # just print and flush
time.sleep(0.2) # sleep for 200ms
Оба были проверены и работают.
Ответ 12
Это очень старый поток, но здесь очень подробный ответ и пример кода.
\r
- строковое представление возврата каретки из набора символов ASCII. Это то же самое, что и восьмеричный 015
[chr(0o15)
] или hexidecimal 0d
[chr(0x0d)
] или десятичный 13
[chr(13)
]. См. man ascii
для скучного чтения. Он (\r
) является довольно портативным представлением и достаточно прост для чтения людьми. Это очень просто означает переместить каретку на пишущей машинке вплоть до начала, не продвигая бумагу. Это CR
часть CRLF
, что означает возврат каретки и подачу строки.
print()
- это функция в Python 3. В Python 2 (любая версия, которую вы хотели бы использовать), print
можно принудительно ввести в функцию, импортировав ее определение из модуля __future__
. Преимущество функции print
заключается в том, что вы можете указать, что печатать в конце, переопределяя поведение по умолчанию \n
для печати новой строки в конце каждого вызова print()
.
sys.stdout.flush
сообщает Python, чтобы очистить вывод стандартного вывода, в котором вы отправляете вывод с print()
, если вы не указали иначе. Вы также можете получить такое же поведение, выполнив команду python -u
или установив переменную окружения PYTHONUNBUFFERED=1
, тем самым пропустив вызовы import sys
и sys.stdout.flush()
. Сумма, которую вы получаете при этом, почти равна нулю и не очень легко отлаживается, если вы просто забываете, что вам нужно сделать этот шаг, прежде чем ваше приложение будет вести себя правильно.
И образец. Обратите внимание, что это отлично работает в Python 2 или 3.
from __future__ import print_function
import sys
import time
ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}
for i in range(1, ANS + 1):
if i in FACTORS:
print('\r{0:d}'.format(i), end='')
sys.stdout.flush()
time.sleep(ANS / 100.0)
else:
print()
Ответ 13
На всякий случай, если вы предварительно сохранили значения в массиве, вы можете вызвать их в следующем формате:
for i in range(0,n):
print arr[i],
Ответ 14
Функция print() имеет встроенный параметр "end", который по умолчанию имеет значение "\n". Вызов print ("Это Америка") на самом деле вызывает print ("Это Америка", end = "\n"). Самый простой способ сделать это - вызвать print ("Это Америка", end = "")
Ответ 15
Я нашел это решение, и он работает над Python 2.7
# Working on Python 2.7 Linux
import time
import sys
def backspace(n):
print('\r', end='') # use '\r' to go back
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
sys.stdout.write(string)
backspace(len(s)) # back for n chars
sys.stdout.flush()
time.sleep(0.2) # sleep for 200ms