You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python logging写入独立目录触发PermissionError怎么无需额外代码解决?

你遇到的WinError 32虽然归类在PermissionError下,但实际不是文件夹权限不足,而是日志文件被当前进程或者其他进程占用,系统无法执行日志滚动时的重命名操作,可按以下步骤排查解决:

  • 修正路径拼接与目录初始化逻辑,你当前的路径拼接写法存在两处错误:
    1. 手动拼接路径分隔符\时没有做转义,会导致生成的路径格式异常
    2. 没有利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:27:02