Различное поведение печати строк (sys.stderr.write) в ноутбуке Jupyter и терминале Linux - PullRequest
0 голосов
/ 04 июля 2018

В Jupyter Notebook при запуске следующих кодов Python число от 2 до 9 печатается один за другим. время импорта

for i in range(1,10):
    time.sleep(1)
    sys.stderr.write('\r %d' % i)
    sys.stderr.flush()

Q1: Почему 1 не напечатано?

Q2: Почему числа печатаются один за другим, я имею в виду, что когда печатается большее число, сразу же меньшее число исчезает (что удивительно)? Почему sys.stderr.write('\r %d' % i) работает в таким образом, но sys.stderr.write('%d \r' % i) работает "нормальным" образом, который отображает все числа?

При запуске вышеуказанных кодов в терминале Linux. Выход снова отличается:

 13
 23
 33
 43
 53
 63
 73
 83
 93

Если я изменю строку sys.stderr.write('\r %d' % i) на sys.stderr.write('%d \r' % i), вывод будет:

3 
3 
3 
3 
3 
3 
3 
3 
3

Это так странно.

В3: Почему при запуске вышеуказанных кодов в терминале Linux вывод отличается?

1 Ответ

0 голосов
/ 04 июля 2018

Q1: почему 1 не напечатано?

Это все же напечатало. Попробуй поспать подольше.

В2: Почему числа печатаются один за другим, я имею в виду, что когда печатается большее число, сразу меньшее число исчезает (что удивительно)?

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

В3: Почему запуск вышеуказанных кодов в терминале Linux имеет другой вывод?

Я не уверен, какой терминал вы имеете в виду. Некоторые терминалы не поддерживают перезапись, поэтому порядок очистки может повлиять на вывод.

Также посмотрите на строку документации по методу write,

метод write (s) экземпляра idlelib.run.PseudoOutputFile Напишите строку в поток. Возвращает количество написанных символов (которое всегда равно длина строки).

Возвращает длину строки, которую вы передали. В оболочке Python (REPL) все возвращаемые значения печатаются после возврата из функции. Попробуйте это в IDLE, где stdin и stderr печатают разными цветами:

>>> sys.stderr.write('x')

Но посмотрите, что произойдет, если вы запустите это в терминале,

>>> sys.stdout.write('abc\r')
4bc

Сначала он печатает abc, затем возвращает курсор в начало строки. Затем он возвращает 4, поскольку в строке было len 4, поэтому REPL в Python печатает его в текущем местоположении курсора, перезаписывая a.

...