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

如何在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(),因为它返回的是执行命令的目录,而非项目根目录)。

  1. 修改main.py:
import os

# 基于main.py的位置计算根目录,而非当前工作目录
PROJECT_DIR_PATH = os.path.dirname(os.path.abspath(__file__))
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:08:12