2017-11-07 14 views
0

私はPythonの問題を抱えています。私はRed Hat Enterprise Linux Serverリリース7.1(Maipo)でPython 2.7.13とPython 3.6.0を使用しました。処理の出力を監視するために、tail -fを使用して、STDOUTとSTDERRをライブビューします。ここのキーワードはバッファリングされていない出力です。インターネット上の多くの提案はpython -u ...またはPYTHONUNBUFFERED=1 python ...またはstdbuf -e0 -o0 python ...のような環境変数PYTHONUNBUFFEREDを使用しています。それにもかかわらず、次のテストスクリプトでは何も起きていません。Pythonがバッファされていないモードで動作していません

import sys 
import time 
while(True): 
    print("Test String") 
    time.sleep(1); 

私はいつもバッファリングされた出力を持っています。私がSTDERRを使いたいときでも。 STDERRはデフォルトでバッファリングされていないので、私は本当に混乱しています。 sys.stdout.flush()またはsys.stderr.flush()を使用してもジョブを実行していません。 print()の中にflush=Trueを使用すると、意図したとおりに動作しています。

私はコードを編集する必要がないソリューションを探しています。私はすべてのプログラムを編集してバッファリングされずにすぐに出力をフラッシュすることができないからです。どうすればこれを達成できますか?

あなたの答えを楽しみにしています!

最高の願い!

+0

は、あなたのテストスクリプトは、何を期待していますか? –

+0

'print(flush = True)'関数をオーバーライドできます。 –

+1

私の元のスクリプトには、監視したいディープ学習とニューラルネットワークのステップがいくつか出力されています。私のテストスクリプトでは、出力がバッファリングされていないかどうかを調べるため、ダミー出力に絞り込んだ。 @ElisByberiのために私はコードを編集する必要があります。いくつかのプログラムは非常に巨大なので、すべてを編集することが混乱で終わるでしょう。私は何か 'python -u'や' PYTHONUNBUFFERED'を探しています。代わりに、彼らは働いています。広告されたとおりに動作しません。 – TheOrangeman

答えて

2

Python 3で関数を無効にすることができます。この方法では、スクリプト内のすべてのprint()関数を変更する必要はありません。

import builtins 


def print(*args): 
    builtins.print(*args, sep=' ', end='\n', file=None, flush=True) 


print(
    'hello', 'world', 
    'I have overrode print() function!', 
    1, # integer 
    [1, 2], # list 
    {1, 2}, # set 
    (1, 2), # tuple 
    {1: 2} # dict 
) 

が印刷されます:

hello world I have overrode print() function! 1 [1, 2] {1, 2} (1, 2) {1: 2} 
+0

あなたの提案をありがとう。残念ながら、出力は '( 'Test String'、)'です。 'python -u'や' PYTHONUNBUFFERED'が宣伝されているように働くと、私は幸せになるでしょう。オプションに関するものを見逃してしまったのでしょうか? – TheOrangeman

+1

@TheOrangeman正直言って、私はコードをテストしなかった。私は一例としてそれを置いています。今は期待どおりに動作します。報告していただきありがとうございます。 –

+0

@TheOrangemanこのコマンドを試してください: 'python -e PYTHONUNBUFFERED = 0 yourscript.py' –

関連する問題