跨文件夹导入函数库至Python脚本失败(Jupyter可正常运行)
解决Python跨路径模块导入问题
针对你的仓库结构:
repo_root/ ├── data/ └── src/ ├── myutils.py └── model_scripts/ └── model.py
以下是两种不依赖控制台启动路径的导入方案,推荐第一种:
方案一:自动添加仓库根目录到模块搜索路径(推荐)
这种方法不受启动路径影响,跨系统通用,步骤如下:
- 在
src目录下创建一个空的__init__.py文件,让Python将src识别为一个可导入的包。 - 在
model.py的开头添加以下代码:
import sys from pathlib import Path # 获取当前脚本的绝对路径 script_path = Path(__file__).resolve() # 定位到仓库根目录(从model.py文件往上两级父目录) repo_root = script_path.parents[2] # 将仓库根目录添加到Python的模块搜索路径 sys.path.append(str(repo_root)) # 现在可以直接用绝对导入 from src.myutils import data_load
不管你在repo_root下执行python src/model_scripts/model.py,还是在repo_root/src下执行python model_scripts/model.py,都能成功导入data_load函数。
方案二:使用相对导入(需按模块方式运行)
如果你不想修改模块搜索路径,可以用相对导入,但必须以模块方式启动脚本:
- 同样需要在
src目录下创建空的__init__.py文件。 - 在
model.py中使用相对导入:
from ..myutils import data_load
- 必须从仓库根目录执行以下命令启动脚本:
python -m src.model_scripts.model
注意:这种方式不能直接运行model.py(比如python src/model_scripts/model.py),否则会触发相对导入错误——直接运行的脚本会被视为顶层模块,无法使用相对导入语法。
为什么之前的os.chdir方法不可靠?
os.chdir仅改变当前工作目录,但Python的模块搜索路径(sys.path)在脚本启动时就已确定。虽然sys.path中的空字符串对应当前工作目录,但这种方式依赖启动路径和目录切换顺序,容易出现跨路径或跨系统的兼容性问题,不如直接修改sys.path稳定。
内容的提问来源于stack exchange,提问作者leeamtlrd
相关产品推荐
相关产品推荐

