Python从父目录导入类/函数报错,求无sys.path.append的解决方法
为什么from src.api.test import tes_func无法正常工作?
Python查找模块时,只会在sys.path列表中的路径里搜索。默认情况下,sys.path包含以下内容:
- 运行脚本时的当前工作目录
- Python标准库的安装路径
- 环境变量
PYTHONPATH指定的路径
当你在src/config/config.py中直接使用from src.api.test import tes_func时,src目录并不在sys.path里——此时sys.path默认包含的是src/config/(config.py所在的目录),而src是src/config/的父目录,不在默认搜索路径中,所以Python找不到src.api这个模块,抛出ModuleNotFoundError。
而你添加sys.path.append("../")后,相当于把src/目录(src/config/的上级目录)加入了sys.path,此时api目录就在这个新增的路径下,所以from api.test import tes_func能成功导入。
无需使用sys.path.append("../")的导入方式
1. 使用相对导入
在config.py中用相对路径语法导入,代码如下:
from ..api.test import tes_func
- 注意事项:
- 你的
src、api、config目录都需要添加空的__init__.py文件,让Python把这些目录识别为包。 - 不能直接运行
config.py作为主脚本(比如python src/config/config.py),因为主模块不支持相对导入。你应该从项目根目录运行入口脚本,比如python src/app.py。
- 你的
2. 将项目根目录加入PYTHONPATH环境变量
找到你的项目根目录(即包含src文件夹的那个目录),把它添加到PYTHONPATH中:
- Windows(命令行):
也可以在系统环境变量设置中永久添加。set PYTHONPATH=C:\path\to\your\project\root;%PYTHONPATH% - Linux/macOS(终端):
export PYTHONPATH=/path/to/your/project/root:$PYTHONPATH
添加后,Python会自动把这个路径加入sys.path,你就能在config.py中直接使用from src.api.test import tes_func了。
3. 将项目安装为可编辑包
在项目根目录下创建pyproject.toml文件,内容示例:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "your-project-name" version = "0.1.0"
然后在终端进入项目根目录,运行:
pip install -e .
这会把项目以可编辑模式安装到Python环境中,此时项目根目录会被加入sys.path,你可以直接使用from src.api.test import tes_func,而且代码修改后无需重新安装。
内容的提问来源于stack exchange,提问作者Shibansu Mandal

