2016-10-26 5 views
0

jsonでフォーマットされたログイベントを単に行単位で画面に出力するスクリプトがあります。 1行は1つのjsonログイベントに相当します。私は通常、結果をファイルに追加して、必要なときに保持します(./script.py >> json.logs)。append(>>)を妨げずにステータスバーをコンソールに出力するにはどうすればよいですか?

このスクリプトは入力に応じて時間がかかりますが、動作しているときにコンソールの下部に単純なプログレスバーまたは数字を追加したいと思います。しかし、私は通常のように追加し、私はそれを望んでいない場合、これもログファイルに書き込まれると思います。

stdoutまたは>>に追加されない何かをコンソールに印刷する通常の方法は何ですか? でも、結果をファイルに記録するのではなく画面に表示するだけであれば、ステータスバーが画面に表示されないようにする必要があります。コンソール画面の)。

+0

tqdmライブラリをご覧ください。 –

答えて

2

>>を使用すると、デフォルトではSTDOUTがファイルにのみパイプされるため、STDERRに印刷するとログには移動しません。たとえば、次のバー自体を作るためのよう

import sys 
print("something") # this will go to json.logs 
print("something else", file=sys.stderr) # this won't go to json.logs unless you specifically tell it to 

、どちらかtqdmのようなものを見たり、特にバーは、ウィンドウの下部に表示したい場合は、あなたがcursesを使用して独自のソリューションを展開する必要があります。または、一度に1つのアスタリスクを印刷するなど、単純な操作を行います。

+0

ありがとうございます。だから、実際にSTDERRをエラーに使う必要がない限り、これを使うのは安全だと私は思っていますか? – Thisisstackoverflow

+0

それは正しいです。これを行う必要がある場合は、ロギング自体を行うためにPythonスクリプトを書き直したいと思うでしょう。 'f = open(" json.log "、" wt ")'、 'print(" something "、file = f)'のようなやり方や、よりロバストなロギングモジュールを利用することができます。 – user3030010

+0

バーを下に保つには、 'tqdm.write()'を使ってすべてのメッセージを書くか、独自の呪いに基づく解決策を使用する必要があります。 – gaborous

1

アイデアはstderr(import sys; sys.stderr.write('the bar')を使用することです。あなたがpython3を使用している場合はprint ('barstuff', file=sys.stderr)を使用できます)。これは、画面にバーを持っている間にstdoutをファイルに保存したい場合には問題ありません。バーを常に画面の下部に表示するには、かなり複雑なように見えます。画面の高さは何かを知っている必要があります。これは、Pythonではほとんど不可能であると思います。

おそらく、いくつかのマジックでは、画面の始めにバーを印刷し、その下にある一定数の行を\ rを使用して古い文字列に書き換えることができます。

+0

ありがとうございます。私はこれで少なくとも始めることができます。私はこれも上記に尋ねました。実際のエラーに対してSTDERRを実際に使用する必要がない限り、このソリューションを使用するのは安全でしょうか? – Thisisstackoverflow

+0

はい!エラーをトレースする場合は、別のファイルをログとして使用できます。 –

関連する問題