2017-10-13 14 views
0

私はPythonを使い慣れていません。私は 'log.txt'ファイルをリアルタイムで(AJAX経由で)読み取る別のフラスコWebアプリケーションを持っています。 "メッセージ1"が表示され、5秒後に "メッセージ2"が表示されます。Python(Flask)はファイルを正しく閉じていませんか?

私は、スタンドアロンPythonスクリプトを作成し、以下の作品(私は最初のメッセージと5秒後に第2のメッセージを参照してください):

f = sys.stdout = sys.stderr = open('static/staging/stdout/discovery.log', 'w') 
    print "Message 1" 
    f.close() 
    time.sleep(5) 

    f = sys.stdout = sys.stderr = open('static/log.txt', 'a') 
    print "Message 2" 
    f.close() 
    time.sleep(5) 

Iそれから私は、ファイルに書き込みをするには、以下のスクリプトを持っていますWebアプリケーションの一部として入れ、関数呼び出しは以下のようになります。両方ともと一緒に表示されます。 10秒後に1つずつ表示されます。

@app.route('/mywriter/') 
def myApp(): 
    f = sys.stdout = sys.stderr = open('static/log.txt', 'w') 
    print "Message 1" 
    f.close() 
    time.sleep(5) 

    f = sys.stdout = sys.stderr = open('static/log.txt', 'a') 
    print "Message 2” 
    f.close() 
    time.sleep(5) 

私はflush()fsync()を使用していたこの段階で、私はとにかくこれらの両方を行いますf.close()をやって理解するものから、指摘しなければなりません。それは私がスタンドアロンのスクリプトとしてそれを置くときに機能するだけでなく、Webアプリケーションの一部としてメソッドに入れるときには機能しません。

+3

なぜあなたは 'stdout/stderr'を上書きしますか?これは、soooooの多くのレベルで間違っているsoooooです。プリントの代わりに適切な 'f.write'を実行してください。とにかくこれは内部バッファリング(コードの外側から操作できる)に関連しているようです。それぞれの書き込みの後に 'f.flush()'行を挿入してみてください。 – freakish

+0

私は期待どおりに動作するstdoutとstderrの両方を指しています。 f.flushメソッドを呼び出すときにf.close()を使用していません。 – Macbook

+2

あなたが最も重要なグローバル変数の1つを悩ましています。ただしないでください。副作用は想像もつきません。とにかく私はあなたの問題を再現しません。どのようにファイルを監視していますか? – freakish

答えて

0

IDEでデバッガを使用します。最初のtime.sleep()でブレークポイントを設定し、行ごとにステップすると、問題をより正確に診断できるはずです。

関連する問題