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

103

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

python client.py | tee logfile

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

некоторые советы будут оценены. заранее спасибо.

дэхи
источник
3
Буферизация ведет себя по-разному для труб и терминалов. Вам может потребоваться сделать явное sys.stdout.flush()из вашего скрипта всякий раз, когда вы регистрируете строку.
Лукас Граф
Чтобы узнать о других способах запуска небуферизованного вывода, см. Stackoverflow.com/q/107705/1328439
Дмитрий Чубаров

Ответы:

179

Откуда man python:

   -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
Вор
источник
1
Альтернативой может быть использование script, которое также отключает буферизацию и дополнительно заставляет C-aработать управляющие последовательности ( клавиши курсора и т. Д.): Stackoverflow.com/a/39269661/15690 .
blueyed 05
превосходно! он также работал в Python 3 на моем Raspberry Pi 3, оснащенном Raspbian Jessie: python3 -u client.py |
Антонино
Примечание: python, как и другие команды, будет использовать строчную буферизацию, если stdin и stdout являются консолями, но полную буферизацию, если результаты перенаправляются в файл или канал. teeвоспринимается как пайп (а это так), а не как гибрид: он пишет в консоль. Примечание: поведение можно также контролировать внутри программы на Python.
Джакомо
Еще одно замечание: python -u client.py | tee >> logfileне сработает. Появится >>еще один случай буферизованной записи в файл. Вот что tee -aрешает.
tanius