возврат каретки не работает в Терминаторе, но отлично работает в Терминале в Ubuntu

Я использую '\ r' в функции печати в python 2.7. Он отлично работает в терминале, но не в терминаторе.


Например:

Я использую счетчик декремента, который уменьшается с n до 0. В терминале значения счетчика обновляются в той же строке, а в терминаторе значения счетчика печатаются на новой строке. Я использую терминатор по разным причинам, например, из-за его расширенных функций, таких как разделение вкладок и т. Д. Ниже приведен снимок кода.

import sys
import time

if __name__ == "__main__":

    sleep_time_in_sec = 15
    time_to_go_back_mns = 10

    for remaining in range(sleep_time_in_sec, -1, -1):
        sys.stdout.write("\r")
        sys.stdout.write(
            "{:2d} seconds remaining to read last {:2d} minutes of data and perform prediction .....".format(remaining,
             time_to_go_back_mns))
        sys.stdout.flush()
        time.sleep(1)

Может кто-нибудь предложить исправление


person Amarjit Dhillon    schedule 15.04.2018    source источник


Ответы (2)


Просто поместите \r в конец вашего оператора записи следующим образом:

sys.stdout.write(
            "{:2d} seconds remaining to read last {:2d} minutes of data and perform prediction .....\r".format(remaining,
             time_to_go_back_mns))

Затем новые данные перезапишут строку, вы можете использовать flush(), чтобы очистить строку перед повторной записью в нее:

sys.stdout.flush()

Убедитесь, что на стороне терминатора настройки вашего профиля чисты. Обязательно проверьте вкладку совместимости, так как там упоминается странное поведение приложений.

введите здесь описание изображения

обратите внимание, что возврат каретки перестает работать, если размер терминала слишком мал. Он вернется только к первому символу ПОСЛЕДНЕЙ строки


Исходный ответ

\r на самом деле означает «возврат каретки», тогда как \n — это перевод строки. В Linux (Unix) вы обычно используете либо \n, либо \r\n.

Поэтому, если ваша цель — перейти на новую строку, вы должны вместо этого использовать \n.

Причина, по которой это может работать в «терминале» (каким бы он ни был), заключается в том, что некоторые терминалы (особенно терминал gnome) перехватывают \r и обрабатывают его как \r\n.

person Rick van Lieshout    schedule 15.04.2018
comment
@PeterWood Я использовал ''\r\n, но он печатается в новой строке. Спасибо за ваш комментарий в любом случае. - person Amarjit Dhillon; 15.04.2018
comment
Я изменил свой ответ после вашего первоначального редактирования :) \r\n действительно напечатал бы его на новой строке - person Rick van Lieshout; 15.04.2018
comment
@PeterWood: использование ''\r в конце строки, как вы предложили, дает тот же результат. Я использую терминатор 0.97, есть ли разница? - person Amarjit Dhillon; 15.04.2018
comment
Я записал небольшой ролик, показывающий, что он работает с последней версией терминатора (1.0): youtube .com/watch?v=5d494o9K4WA Наверное, это настройка на стороне клиента. - person Rick van Lieshout; 15.04.2018
comment
обратите внимание, что возврат каретки перестает работать, если размер терминала слишком мал. Он вернется только к первому символу ПОСЛЕДНЕЙ строки :) - person Rick van Lieshout; 15.04.2018
comment
вы совершенно правы. В этом была проблема. Я использовал 8 вкладок в одном терминале. Но когда я попробовал это на отдельном терминале, это сработало как шарм. - person Amarjit Dhillon; 16.04.2018
comment
вот бы это сделать! Хорошего дня :) - person Rick van Lieshout; 16.04.2018

Ответ на этот пост принадлежит @Rick van Lieshout.


В моем случае я использовал несколько вкладок в одном окне, в результате чего \r не работал. Он отлично работал, когда я использовал его в отдельном окне или на вкладке с полной горизонтальной шириной.

person Amarjit Dhillon    schedule 15.04.2018