Linux tee не працює з python?


102

Я створив сценарій python, який взаємодіє з веб-сервером за допомогою нескінченного циклу. Я хочу реєструвати всі дані зв'язку у файл, а також одночасно контролювати їх із терміналу. тож я використовував команду tee, як це.

python client.py | tee logfile

однак я нічого не отримав від терміналу та журналу. сценарій python працює нормально. що тут відбувається? мені чогось не вистачає?

деякі поради будуть вдячні. наперед дякую.


3
Буферизація поводиться по-різному для труб і клем. Можливо, вам доведеться робити явний текст sys.stdout.flush()зі свого сценарію, коли ви реєструєте рядок.
Лукас Граф,

Інші способи активувати негарний вихід див. Na stackoverflow.com/q/107705/1328439
Дмитро Чубаров,

Відповіді:


178

Від 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 .
посинено

чудово! він працював також у 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.