2011-04-13 26 views
3

我測試了用於Python的日誌記錄模塊一些簡單的日誌記錄的例子在IDLE:爲什麼IDLE在再次運行時不會創建帶日誌記錄模塊的新日誌文件?

import logging 

logging.basicConfig(level=logging.DEBUG, 
    format='%(asctime)s %(levelname)s %(message)s', filename='TESTLOG.log') 

logging.debug('A debug message') 

而且它按預期工作:與調試信息創建一個名爲TESTLOG.log的文件。

但是,如果我在IDLE腳本窗口打開時刪除日誌文件,當我嘗試再次運行模塊/ f5時,不會創建新的日誌文件。如果關閉腳本窗口,然後重新打開並運行它,則會創建日誌文件。相反,如果我從命令行運行腳本,日誌文件總是在我刪除日誌文件並重新運行腳本後生成的。

這兩種情況有什麼區別?

回答

1

第一次調用basicConfig時,它將Handler添加到logging模塊的根記錄器中。隨後調用basicConfig檢查以查看根記錄器中是否已有處理程序,如果有,則對basicConfig的調用不起作用(即不會重新創建日誌文件)。

如果您打開一個IDLE窗口並運行腳本,則會加載日誌記錄模塊,腳本會通過basicConfig的調用來配置根日誌記錄器。因爲您之後沒有關閉IDLE窗口,所以日誌記錄模塊保持加載狀態,隨後對basicConfig的調用不起作用。

關閉並重新打開IDLE窗口會有效啓動python的新實例,並且必須重新加載日誌記錄模塊,因此對basicConfig的調用會產生影響。同樣,從命令行運行腳本需要在每次腳本運行時新建一個python實例。

+0

謝謝。這是有道理的,並幫助我更好地理解日誌記錄模塊。 – monkeylytics 2011-04-15 17:24:14

0

你不說你正在使用什麼操作系統,但我想這不是Windows,因爲你不能刪除Windows中打開的文件。在Linux上,打開文件可以刪除,但該文件掛起,直到所有打開的句柄關閉,然後消失。這看起來與您看到的一致:在IDLE情況下,只要IDLE正在運行,文件就會保持打開狀態,因此即使刪除了文件,文件仍然存在,直到IDLE進程終止。在腳本的情況下,它們每次都會終止,因此文件被關閉,當您刪除它時,它真的被刪除。

相關問題