Python logging写入独立目录触发PermissionError怎么无需额外代码解决?
你遇到的WinError 32虽然归类在PermissionError下,但实际不是文件夹权限不足,而是日志文件被当前进程或者其他进程占用,系统无法执行日志滚动时的重命名操作,可按以下步骤排查解决:
- 修正路径拼接与目录初始化逻辑,你当前的路径拼接写法存在两处错误:
- 手动拼接路径分隔符
\时没有做转义,会导致生成的路径格式异常 - 没有利用
os.path.join自动适配系统分隔符的特性,多余的手动拼接反而会导致路径错误
修正后的写法如下,os.makedirs是Python标准库内置方法,不属于自定义函数,符合你的要求:
# 先确保logs目录存在 log_dir = os.path.join(os.getcwd(), 'logs') os.makedirs(log_dir, exist_ok=True) log_file_name = os.path.join(log_dir, 'sample.log') - 手动拼接路径分隔符
- 避免重复添加handler导致的多句柄占用:你的现有代码如果被多次执行/导入,会重复给同一个logger绑定文件处理器,导致单个进程内就有多个句柄占用同一个日志文件,滚动时无法重命名。在添加handler前增加非空判断即可:
logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # 已经添加过handler就不再重复添加 if not logger.handlers: formatter = logging.Formatter('[%(asctime)s] [%(name)s] [%(funcName)s()] [%(levelname)s] : %(message)s') file_handler = handlers.TimedRotatingFileHandler(log_file_name, when='midnight', backupCount=100, delay=True, encoding='utf-8') file_handler.setFormatter(formatter) stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.addHandler(stream_handler) - 检查外部进程占用情况:确认你没有用日志查看工具、文本编辑器打开目标
sample.log文件,部分杀毒软件也会实时扫描新建的日志文件临时占用句柄,可以临时关闭测试验证。 - 检查目录权限:确认运行脚本的Windows用户对
logs目录拥有写入、修改、删除文件的权限,右键文件夹选择「属性」-「安全」即可查看当前用户的权限配置。
内容的提问来源于stack exchange,提问作者Jagajith Nambiar
相关产品推荐
相关产品推荐

