2017-09-19 13 views
1

Linux上のプログラムによって書き込まれたファイルを監視する方法を探しています。 heretail -Fコマンドがあり、またless +FGが推奨されました。他でtailとlessコマンドがリアルタイムでファイルを監視していない

import time 

for i in range(20): 
    print i 
    time.sleep(0.5) 

:私は1台の端末でtail -F file、簡単なPythonスクリプトを実行して、それをテスト。私は、出力をファイルにリダイレクト:

python script.py >> file 

私はtailは、ファイルの内容を追跡し、一定の間隔で表示を更新すると予想、代わりにそれが唯一のコマンドが終了した後、ファイルに書き込まれたかを示しています。

less +FGと同じことが起こります。また、出力をcatから見ると、私はまた、ファイル>>>の代わりに切り捨てる通常のリダイレクトを使ってみました。ここではファイルが切り捨てられていると言われていますが、それでもリアルタイムではそれをトラッキングしません。

これはなぜ機能しないのでしょうか? (バッファの書き込みが原因かもしれないとhereを示唆していますが、私のスクリプトが10秒以上を実行しているので、私はこれが原因ではないかもしれない疑いがある)

編集:それは重要な場合は、私がLinuxのミント18.1

を実行していますよ

答えて

7

Pythonの標準出力はバッファされています。スクリプト/スクリプトが閉じられたときに、すべての出力が表示されます。これは挑戦的なバッファの問題です。

あなたは代わりにこれを使用することができます:

import time 
import sys 

for i in range(20): 
    sys.stdout.write('%d\n' % i) 
    sys.stdout.flush() 
    time.sleep(0.5) 

私はそれをテストしたのだが、リアルタイムで値を出力します。バッファの問題を克服するために、それぞれの.write()メソッドの後に私は.flush()強制的にバッファを "フラッシュ"します。コメントから


追加オプション:

  • 使用sys.stdout.flush()あとがき
  • ランバッファなしバイナリstdoutとstderrのためpython -uとPythonスクリプト
+1

Probalyしたいです'sys.stdout.write( '%d \ n'%i)'、またはこれと同等のものです。 – larsks

+0

@larsksコメントをいただきありがとうございます。私の回答で修正しました – Vinny

+4

あなたは 'print'として残しても、' sys.stdout.flush() 'を使用することができます。 –

0

と、元の文print jon1467については、答える(ごめんなさいあなたのリダイレクトの理解は間違っています。

これを試してみてください:

dd if=/dev/urandom > test.txt 

で、ファイルサイズを見ながら:

ls -l test.txt 

あなたはddが実行中にファイルが育つ表示されます。

ビニーの答えは正しいですが、Pythonの標準出力はバッファされています。 "バッファリング効果"の一般的な方法は、ビニーがあなたに示したように標準出力をフラッシュすることです。

あなたはまた、全体のpythonのプロセスのためのバッファリングを無効にする-uオプションを使用することができ、またはあなただけの(少なくともpython2で)以下のように0のバッファサイズで標準出力を再度開くことができます:

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) 
関連する問題