2017-10-13 68 views
0

我是python新手。我有一個單獨的燒瓶web應用程序,實時讀取'log.txt'文件(通過AJAX) 預期結果是它顯示「消息1」,5秒後顯示「消息2」。然後,我有以下腳本寫入文件:Python(Flask)沒有正確關閉文件?

當我做一個獨立的Python腳本下面的工作(我看到的第一個消息,5秒後,第二個消息):

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) 

當我把它作爲Web應用程序的一部分,並且函數Is Call如下所示,它們都在10秒後出現而不是一個接一個。

@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的許多層面上這是如此錯誤。只要做適當的'f.write'而不是打印。無論如何,這似乎與內部緩衝(可以從代碼外部操縱)有關。嘗試在每次寫入後插入'f.flush()'行。 – freakish

+0

我正在指導stdout&stderr,它按預期工作。我已經提到我已經使用過'f.flush()',但是我沒有使用f.close(),因爲它調用了 – Macbook

+2

中的f.flush方法,你正在搞亂一個最重要的全局變量。不要。副作用很難想象。無論如何,我不能再現你的問題。你如何監控文件? – freakish

回答

0

在IDE中使用調試器。在第一次調用break.sleep()時,設置一個斷點,然後逐行執行,您應該能夠更準確地診斷問題。