如何在Python项目中导入根目录路径,规避FileNotFoundError
解决Python项目中跨目录文件路径的健壮性问题
问题描述
项目结构如下:
├── main.py └── utils ├── assets │ ├── export.csv ├── client.py
utils/client.py中有这段代码:
df = pd.read_csv("/assets/export.csv")
在项目根目录执行命令 python utils/client.py 时触发错误:
FileNotFoundError: [Errno 2] No such file or directory: '/assets/export.csv'
需要实现的是:让utils/client.py能正确获取项目根目录路径,不管在项目内哪个位置执行命令,都能找到export.csv,避免使用硬编码的绝对路径。
方案一:通过__file__直接计算根目录(推荐,不依赖其他文件)
这种方法不需要依赖main.py,直接在client.py里计算项目根路径,不受执行命令的位置影响,是最可靠的方式。
修改utils/client.py:
import os import pandas as pd # 获取当前文件(client.py)的绝对路径 current_file_path = os.path.abspath(__file__) # 往上两级目录即为项目根目录(client.py在utils下,utils在根目录下) project_dir_path = os.path.dirname(os.path.dirname(current_file_path)) # 拼接assets文件路径 csv_path = os.path.join(project_dir_path, "utils", "assets", "export.csv") df = pd.read_csv(csv_path)
或者用更简洁的pathlib(Python3.4+支持):
from pathlib import Path import pandas as pd # 获取当前文件的父级父级目录,即项目根 project_dir_path = Path(__file__).parent.parent csv_path = project_dir_path / "utils" / "assets" / "export.csv" df = pd.read_csv(csv_path)
方案二:基于main.py的导入方案(修正你的预期示例)
你给出的示例里直接用from ../main.py import不符合Python导入规则,需要调整实现方式,同时要修正main.py里的路径计算逻辑(不能用os.getcwd(),因为它返回的是执行命令的目录,而非项目根目录)。
- 修改
main.py:
import os # 基于main.py的位置计算根目录,而非当前工作目录 PROJECT_DIR_PATH = os.path.dirname(os.path.abspath(__file__))
- 修改
utils/client.py:
方法A:临时添加根目录到模块搜索路径
import sys import os import pandas as pd # 把项目根目录加入Python模块搜索路径 current_file_path = os.path.abspath(__file__) project_dir_path = os.path.dirname(os.path.dirname(current_file_path)) sys.path.append(project_dir_path) from main import PROJECT_DIR_PATH csv_path = os.path.join(PROJECT_DIR_PATH, "utils", "assets", "export.csv") df = pd.read_csv(csv_path)
方法B:把项目作为包运行(更规范)
如果将项目当作Python包管理,可使用相对导入:
- 先在项目根目录和
utils目录下分别创建空的__init__.py文件 - 修改
utils/client.py:
from ..main import PROJECT_DIR_PATH import pandas as pd csv_path = os.path.join(PROJECT_DIR_PATH, "utils", "assets", "export.csv") df = pd.read_csv(csv_path)
- 执行命令时需以包的方式运行,比如在项目根目录执行:
python -m utils.client,或在根目录外执行:python -m your_project_name.utils.client
内容的提问来源于stack exchange,提问作者sikepike
相关产品推荐
相关产品推荐

