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

如何解决Python跨子目录写入文件时的路径错误

解决Python日志文件路径错误问题

问题描述

项目中src/logger.py需要在同级的logs目录创建日志文件,但使用log_file = f"logs/{today_date}.log"时,Python会在src目录下查找logs,触发FileNotFoundError:

FileNotFoundError: [Errno 2] No such file or directory: '/Users/ribahshaikh/projects/hht_webapp/src/logs/2024-01-25.log'

项目结构:

.
├── README.md
├── __init__.py
├── data
│   └── test_database.db
├── flask_app
│   ├── main.py
│   └── templates
│       └── index.html
├── logs
└── src
    ├── __init__.py
    ├── constants.py
    ├── logger.py
    ├── utils.py

解决方案

方法1:基于文件路径生成项目根目录(推荐)

通过__file__获取logger.py的绝对路径,向上回溯到项目根目录,再拼接logs路径,不受工作目录影响:

import os
from datetime import datetime

today_date = datetime.now().strftime("%Y-%m-%d")
# 获取项目根目录(src的上级目录)
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 拼接日志文件路径
log_file = os.path.join(project_root, "logs", f"{today_date}.log")

方法2:使用上级目录相对路径

如果确保始终从项目根目录运行脚本,可以直接用上级跳转的相对路径:

from datetime import datetime

today_date = datetime.now().strftime("%Y-%m-%d")
log_file = f"../logs/{today_date}.log"

⚠️ 注意:如果直接运行src/logger.py(比如python src/logger.py),这种方法依然会报错,因为此时工作目录是src,../才指向项目根目录。

方法3:定义全局根目录常量

在src/constants.py中统一配置项目根目录,方便其他模块复用:
src/constants.py:

import os
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

src/logger.py:

from datetime import datetime
from .constants import PROJECT_ROOT
import os

today_date = datetime.now().strftime("%Y-%m-%d")
log_file = os.path.join(PROJECT_ROOT, "logs", f"{today_date}.log")

问题原因

Python的相对路径是基于当前工作目录解析的,而非脚本文件所在目录。当脚本从src目录启动(或工作目录设为src),logs/会被解析为src/logs/,而非项目根目录下的logs/。使用基于脚本文件的绝对路径可以彻底规避这个问题。

内容的提问来源于stack exchange,提问作者Aamir Shaikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:42:35