为什么IDLE在再次运行时不生成新的日志文件?

3 投票
2 回答
1816 浏览
提问于 2025-04-16 15:37

我在IDLE里测试了一些Python日志模块的简单示例:

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)时,新的日志文件不会被创建。如果我关闭脚本窗口,然后再重新打开并运行它,日志文件就会被创建。

相反,如果我从命令行运行这个脚本,即使我删除了日志文件,重新运行脚本后,日志文件总是会生成。

这两种情况有什么不同呢?

2 个回答

0

你没有说明你使用的是什么操作系统,但我猜不是Windows,因为在Windows上你不能删除正在打开的文件。在Linux系统上,打开的文件是可以被删除的,但这个文件会一直存在,直到所有打开它的程序都关闭了,然后才会消失。这和你看到的情况很一致:在IDLE的情况下,只要IDLE在运行,文件就会保持打开状态,所以即使你删除了它,文件实际上还是存在的,直到IDLE这个程序结束。而在脚本的情况下,每次运行完后程序就会结束,所以文件会被关闭,当你删除它时,它就真的被删除了。

2

第一次调用 basicConfig 时,它会给根日志记录器添加一个 处理器,这个处理器是属于 日志记录 模块的。之后再调用 basicConfig 时,它会检查根日志记录器里是否已经有处理器。如果已经有了,那再调用 basicConfig 就没有任何效果了(也就是说,它不会重新创建日志文件)。

如果你打开一个 IDLE 窗口并运行你的脚本,日志记录模块就会被加载,而你的脚本会通过调用 basicConfig 来配置根日志记录器。因为你没有关闭 IDLE 窗口,所以日志记录模块一直保持加载状态,之后再调用 basicConfig 就不会有任何效果。

关闭并重新打开 IDLE 窗口就相当于启动了一个新的 Python 实例,这样日志记录模块就必须重新加载,因此这时调用 basicConfig 就会有效果。同样,从命令行运行脚本时,每次运行脚本也需要一个新的 Python 实例。

撰写回答