linux tee не работает с питоном?

Я сделал скрипт на Python, который взаимодействует с веб-сервером, используя бесконечный цикл. Я хочу записывать все данные связи в файл, а также одновременно отслеживать их с терминала. поэтому я использовал команду tee вот так.

python client.py | tee logfile

однако я ничего не получил ни из терминала, ни из файла журнала. скрипт python работает нормально. что здесь происходит? я что-то упускаю?

был бы признателен за некоторые советы. заранее спасибо.


person daehee    schedule 09.02.2014    source источник
comment
Буферизация ведет себя по-разному для труб и терминалов. Вам может потребоваться явное sys.stdout.flush() из вашего скрипта всякий раз, когда вы регистрируете строку.   -  person Lukas Graf    schedule 09.02.2014
comment
Чтобы узнать о других способах запуска небуферизованного вывода, см. stackoverflow.com/q/107705/1328439   -  person Dmitri Chubarov    schedule 31.03.2017


Ответы (2)


От 1_:

   -u     Force stdin, stdout and stderr to  be  totally  unbuffered.   On  systems
          where it matters, also put stdin, stdout and stderr in binary mode.  Note
          that there is internal buffering in xreadlines(), readlines()  and  file-
          object  iterators  ("for  line  in sys.stdin") which is not influenced by
          this option.  To work around this, you will want to use  "sys.stdin.read‐
          line()" inside a "while 1:" loop.

Итак, что вы можете сделать:

/usr/bin/python -u client.py >> logfile 2>&1

Или используя tee:

python -u client.py | tee logfile
person Vor    schedule 09.02.2014
comment
Альтернативой может быть использование script, которое также отключает буферизацию и дополнительно заставляет работать управляющие последовательности (C-a, клавиши курсора и т. Д.): stackoverflow.com/ а / 39269661/15690. - person blueyed; 05.09.2016
comment
отлично! он также работал в Python 3 на моем Raspberry Pi 3, оснащенном Raspbian Jessie: python3 -u client.py | файл журнала tee - person Antonino; 27.03.2017
comment
Примечание: python, как и другие команды, будет использовать строчную буферизацию, если stdin и stdout являются консолями, но полную буферизацию, если результаты перенаправляются в файл или канал. tee выглядит как пайп (а это и есть), а не гибрид: он пишет в консоль. Примечание: поведение можно также контролировать внутри программы на Python. - person Giacomo Catenazzi; 06.04.2019
comment
Еще одно замечание: python -u client.py | tee >> logfile не сработает. >> представит еще один случай буферизированной записи в файл. Вот что решает tee -a. - person tanius; 26.06.2019
comment
Также можно поместить -u в строку shebang, и это сработает: #! / Usr / bin / python3 -u - person Sergey M; 28.04.2021

Вместо того, чтобы делать его полностью небуферизованным, вы можете сделать его линейным, как это обычно бывает с sys.stdout.reconfigure(line_buffering=True) (после import sys, конечно).

Это было добавлено в 3.7, docs: https://docs.python.org/3/library/io.html#io.TextIOWrapper.reconfigure

person stefanct    schedule 12.07.2021