如何从父目录导入Python类或函数?导入报错求解
为什么from src.api.test import test_func无法正常导入?
Python查找模块时,只会在sys.path列表中的目录里搜索。当你在src/config/config.py中使用这个导入语句时,默认情况下sys.path包含的是src/config/目录(因为当前运行的脚本位于此目录),而src目录并不在sys.path的搜索范围内,所以Python找不到src.api这个模块,从而抛出ModuleNotFoundError。
无需sys.path.append("../")的导入方法
方法1:使用相对导入
在config.py中改用相对导入的写法:
from ..api.test import test_func
注意:这种写法要求config.py必须作为src包的一部分被导入,不能直接运行config.py(比如不能在src/config/目录下执行python config.py),否则会触发ValueError: attempted relative import in non-package错误。正确的使用方式是从项目根目录启动脚本,例如执行python src/app.py,通过app.py来导入config.config。
方法2:设置PYTHONPATH环境变量
将包含src目录的项目根目录添加到PYTHONPATH环境变量中:
- Windows命令行:
set PYTHONPATH=你的项目根目录路径;%PYTHONPATH% - Linux/macOS终端:
export PYTHONPATH=/你的项目根目录路径:$PYTHONPATH
设置完成后,Python会将该目录加入模块搜索路径,此时你在config.py中就能直接使用from src.api.test import test_func完成导入。
方法3:将src转为可安装包
在项目根目录下创建pyproject.toml(或setup.py),将src目录声明为Python包,然后执行开发模式安装:
pip install -e .
安装后,src会被加入Python的全局模块搜索路径,无论你在哪个目录运行脚本,都能直接使用from src.api.test import test_func进行导入。
内容的提问来源于stack exchange,提问作者pl-jay

