2011-09-04 51 views
5

我正在嘗試調試一些我寫的代碼,這涉及很多並行進程。並有一些不需要的行爲涉及到輸出到sys.stdout和某些消息被打印兩次。爲了調試目的,知道在某個點sys.stdout是否已被刷新會非常有用。我想知道這是否可能,如果是的話,怎麼樣?如何判斷sys.stdout是否已在Python中刷新

Ps。我不知道它是否重要,但我使用OS X(至少有一些sys命令取決於操作系統)。

+6

刷新與否,sys.stdout不會給你保證進程之間的順序(甚至可能在同一進程中的線程之間)。爲什麼不分別添加準確的時間戳記和日誌消息,或者甚至更好地讓所有人都通過線程安全或進程間隊列發送調試消息? – James

+0

問題是相同的輸出發生兩次,所以添加時間戳e.t.c.將不會真的有幫助。同時將sys.stdout更改爲自定義也無濟於事,因爲這對緩衝區來說確實是一個問題。如果我用-u標誌啓動所有涉及的python進程,我不會遇到問題。我想知道究竟發生了什麼,而不是在某些IO發生後總是沖洗,因爲如果不理解問題的核心,那只是一個醜陋的解決方法。 – koffie

回答

1

答案是:你不能告訴(不是沒有嚴重的醜陋,外部C模塊或類似)。

原因是python的文件實現基於FILE *的C(stdio)實現。所以一個基礎的python文件對象基本上只有一個對打開的FILE的引用。當寫入數據時,C實現寫入數據,當你告訴它python也只是轉發flush調用。所以Python不保存這些信息。即使是底層的C層,一個快速搜索也會返回,沒有記錄的API允許您訪問這些信息,但它可能位於對象的某個位置,因此理論上可以讀出它是否非常需要。

+0

謝謝,不好意思,如果可能的話,它是如此麻煩。因爲我只想知道這只是爲了調試,所以我只是決定廣告sys.stdout.flush()語句,看看我的程序行爲是否改變。如果它改變了,我認爲它在那個時候沒有被刷新。 – koffie

相關問題