Linux TeeはPythonで動作しませんか?


102

無限ループを使用してWebサーバーと通信するPythonスクリプトを作成しました。すべての通信データをファイルに記録し、端末から同時に監視したい。だから私はこのようにティーコマンドを使いました。

python client.py | tee logfile

しかし、ターミナルやログファイルから何も得られませんでした。Pythonスクリプトは正常に動作しています。ここで何が起きてるの?私は何かを逃していますか?

いくつかのアドバイスをいただければ幸いです。前もって感謝します。


3
バッファリングは、パイプとターミナルでは動作が異なります。sys.stdout.flush()行をログに記録するたびに、スクリプトから明示的に行う必要がある場合があります。
Lukas Graf

バッファなしの出力をトリガーする他の方法については、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は
2016

優れた!Raspbian Jessieを搭載した私のRaspberry Pi 3のPython 3でも機能しました:python3 -u client.py | teeログファイル
Antonino 2017年

注:pythonは、他のさまざまなコマンドと同様に、stdinとstdoutがコンソールの場合はバッファリングされた行を使用しますが、結果がファイルまたはパイプにリダイレクトされた場合はフルバッファリングされます。teeパイプではなく、パイプのように見えますが、ハイブリッドではありません。コンソールに書き込みます。注:Pythonプログラム内で動作を制御することもできます。
Giacomo Catenazzi

別のメモ:機能python -u client.py | tee >> logfileしません。>>ファイルへのバッファリング書き込みの別のケースをご紹介します。それがtee -a解決します。
tanius
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.