Python TimedRotatingFileHandler在Windows下无法重命名日志文件问题
问题:PyInstaller打包的Click CLI工具日志轮转触发权限错误
场景与现象
- 使用Click库开发Python CLI工具,通过PyInstaller打包为Windows可执行文件
- 日志组件采用
TimedRotatingFileHandler,日志文件路径为%USER%\AppData\Local\Temp\some_folder\logs\app.log,配置为每日午夜轮转、保留7份备份 - 首次运行命令时,日志创建与写入均正常;次日运行命令触发日志轮转逻辑时,出现权限错误:
PermissionError: [WinError32] The process cannot access the file because it is being used by another process 'C:\Users\SOME_USER\AppData\Local\Temp\SOME_FOLDER\logs\app.log' -> 'C:\Users\SOME_USER\AppData\Local\Temp\SOME_FOLDER\logs\app.log.2025-03-03'
- 确认用户不会并发执行该CLI命令,理论上应为单进程运行
疑惑点
- PyInstaller是否会导致日志文件句柄未被正确释放?
- Click框架是否存在导致文件句柄泄漏的情况?
- 是否需要在CLI命令执行完毕后手动清理日志处理器?
日志实现代码
logger = logging.getLogger(name) logger.setLevel(logging.DEBUG) path = pathlib.Path.home() / filename file_handler = logging.handlers.TimedRotatingFileHandler(path, when="midnight", interval=1, backupCount=7) file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(logging.Formatter(LOG_FORMATTER)) logger.addHandler(file_handler)
补充测试信息
在未打包的Python测试环境中,手动修改日志文件的最后修改时间后,日志轮转(重命名操作)可正常执行;但打包为exe后执行同样操作会触发上述权限错误。
内容的提问来源于stack exchange,提问作者d4vid_Bry4n
相关产品推荐
相关产品推荐

