Возврат каретки Python и поток

Итак, у меня есть скрипт, который будет непрерывно считывать данные с датчика, печатать возврат каретки, а затем значение датчика. Это происходит до тех пор, пока raw_input() не завершит блокировку (нажата клавиша ввода).

Однако, когда я запускаю его, вместо увеличения числа я вижу пустое место. Когда я нажимаю ввод, печатается одно число, а затем программа закрывается. Если \r заменить на \n, программа запустится как надо, распечатав значение «датчика» (i = i + 1 — это заполнитель для показания датчика), но вместо того, чтобы повторно использовать ту же строку, она распечатает его на новой строке. Почему не работает с \r? Вот полный код:

from threading import Thread
from time import sleep
import sys

running = True

def loop():
        i = 0
        while running:
                sys.stdout.write("\r" + str(i))
                i = i+1
                sleep(0.1)


thread = Thread(target=loop)
thread.start()
raw_input()
running = False
thread.join()

person Luke Moll    schedule 23.07.2014    source источник
comment
Возможно, вы захотите прочитать это: stackoverflow.com/questions/ 1761051/разница-между-n-и-r   -  person jean-loup    schedule 23.07.2014
comment
используя \r, он печатает последовательные строки, а используя \n, он печатает новую строку, как и должно быть. Какой результат вы ожидаете увидеть?   -  person Padraic Cunningham    schedule 23.07.2014
comment
@PadraicCunningham, используя \r на моем, ничего не показывает мне, пока я не нажму Enter, затем я вижу одну строку и наши закрытия. Я должен увидеть в начале одну строку, которая переписывается и увеличивается, и останавливается, когда я нажимаю ввод.   -  person Luke Moll    schedule 23.07.2014
comment
используя \r, я вижу 1True и т. д. Я не думаю, что вам нужно глобальное ключевое слово.   -  person Padraic Cunningham    schedule 23.07.2014
comment
@PadraicCunningham извините, я оставил их, когда тестировал код. Что он делает теперь, когда я его отредактировал?   -  person Luke Moll    schedule 23.07.2014
comment
то же самое, 0..., затем новая строка для \n вывод находится в одной строке для \r   -  person Padraic Cunningham    schedule 23.07.2014
comment
@Padraig Cunningham, я удалил часть print running .   -  person Luke Moll    schedule 23.07.2014
comment
Я отредактировал свой комментарий, вывод такой же, за исключением True, разница в том, что вывод \r находится в одной строке.   -  person Padraic Cunningham    schedule 23.07.2014
comment
@PadraicCunningham, вывод \n, который, как я знаю, работает, вывод \r перезаписывает ту же строку или добавляет ее?   -  person Luke Moll    schedule 23.07.2014
comment
Какой питон вы используете? я на 2.7   -  person Luke Moll    schedule 23.07.2014
comment
используя Python 2.7 на Ubuntu 14.05, какую ОС вы используете?   -  person Padraic Cunningham    schedule 23.07.2014


Ответы (2)


Разница в том, что запись новой строки очищает канал, а запись возврата каретки (или большинства других символов) - нет. Вы можете получить такое же поведение, добавив явный сброс после write():

sys.stdout.flush()

Что касается почему отсутствие сброса приводит к тому, что raw_input() никогда не возвращается, я полагаю, что это связано с буферизацией, присутствующей в stdout; однако я не смог найти более подробной информации.

person Rob Hague    schedule 23.07.2014

Я пытался что-то сделать и попытался сбросить вывод с помощью sys.stdout.flush(), и это сработало. Спасибо за вашу помощь.

person Luke Moll    schedule 23.07.2014