Возврат каретки не работает в Linux, если окно консоли слишком мало для текста

#python #linux #stdout #carriage-return

#python #linux #стандартный вывод #возврат каретки

Вопрос:

Я несколько дней боролся, пытаясь динамически обновлять печатный вывод с помощью возврата каретки. В Windows все работало нормально, но в Linux постоянно печатаются новые строки. Я протестировал все различные решения, предоставленные в stackoverflow, но ни одно из них не сработало. Наконец-то я узнал, что все дело в размере окна терминала Linux! Смотрите следующий код:

 import numpy as np
import sys

def printing():
    while True:
        sys.stdout.write('r%.8g                                     %s'%(np.random.rand(), 'test             '))
        sys.stdout.flush()

printing()
  

В Windows (Spyder) вы получаете ожидаемый результат, а именно, что печатается и обновляется только одна строка.
В Linux это, похоже, зависит от размера окна консоли, потому что если окно достаточно большое, чтобы в него поместилась вся строка, то эта строка обновляется правильно. Однако, если я сделаю окно настолько маленьким, что текст частично будет в новой строке, тогда скрипт сделает это:

 0.81887604                                  test   
0.93397997                                  test    
0.67231912                                  test    
0.83398159                                  test    
0.26675238                                  test    
0.64693328                                  test    
0.12057606                                  test    
0.17320486                                  test    
0.42479957                                  test    
0.12575117                                  test    
0.18562281                                  test   
  

Как я могу предотвратить это? В моем реальном скрипте я не могу заранее определить, какой будет длина текста, поэтому я не знаю требуемого размера окна консоли.

Спасибо за вашу помощь!

Комментарии:

1. Я предлагаю перенаправить sys.stdout в файл в Linux. Например python xxx.py > result.txt

2. К сожалению, для меня это не обходной путь, поскольку целью программы является слишком непрерывное отображение этих значений.