sys.stdout.write () В интерактивном режиме действует иначе - PullRequest
2 голосов
/ 14 июля 2020

У меня есть код:

import sys
import time

for i in range(10):
    sys.stdout.write("\r Loading: {}".format(i))
    sys.stdout.flush()
    time.sleep(0.5)

, который отлично работает, когда я запускаю python3 dynamic_print.py, но когда я запускаю интерактивный интерпретатор, набирая python3, копирую и запускаю в него приведенный выше код , Я получаю результат:

 Loading: 012
 Loading: 112
 Loading: 212
 Loading: 312
 Loading: 412
 Loading: 512
 Loading: 612
 Loading: 712
 Loading: 812
 Loading: 912

Последние две цифры 12 обновляются каждый раз, когда я запускаю его (это было 11, когда я запускал его в последний раз). Почему он действует иначе и как это уменьшить?

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

12 - это возвращаемое значение write, т.е. количество записанных символов. который в интерактивном режиме распечатывается, за которым следует перевод строки

, чтобы исправить это, вы можете либо указать интерпретатору, что вас не интересует это значение (например, используя _ = stdout.write(s)), либо вы можете поместить все в функцию и, следовательно, держите его подальше от REPL

Я бы предложил сделать последнее, например, что-то вроде:

def looper(n):
    for i in range(n):
        sys.stdout.write("\r Loading: {}".format(i))
        sys.stdout.flush()
        time.sleep(0.5)
    sys.stdout.write("\n")

, затем вызвать looper(10)

1 голос
/ 14 июля 2020

Прежде всего, вы получаете разные результаты, потому что при запуске python3 dynamic_print python компилирует ваш файл и генерирует байт-код для вашего python кода (.py c), а затем выполняет его во время выполнения python.

Когда вы используете python3 на консоли, он интерпретирует команды по мере их ввода. Таким образом, вы не можете очистить вывод, сгенерированный в консоли python, просто. Вот почему вы получаете результат каждый раз в новой строке.

Еще одна вещь, на которую следует обратить внимание, - это разница между python3 print() и sys.stdout.write() - это тип возвращаемого значения, который имеет каждый из них. print() ничего не возвращает, а sys.stdout.write возвращает длину строки. Обратитесь к к этому ответу . Тип возвращаемого значения является причиной получения дополнительных 12 .

...