如何解决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
相关产品推荐
相关产品推荐

