Azure ML使用预构建Docker镜像运行管道报ModuleNotFoundError
问题根因
- 你写的
sys.path.append(".")追加的是脚本执行时的当前工作目录(CWD),而非入口脚本自身所在的目录。本地运行能成功是因为你本地执行脚本时,CWD刚好是Preprocess文件夹的父目录;但Azure ML执行PythonScriptStep时,默认CWD和你本地的执行路径不一致,大概率落在了Pipeline子目录或者Preprocess目录本身,Python在CWD下找不到Preprocess包,就会抛出导入错误。 - 从你给出的项目结构看,包层级本身没有问题,
Preprocess目录下也存在__init__.py,不属于漏写包标识文件的问题。
修复方案
方案1:基于脚本绝对路径追加搜索路径(无环境依赖,优先推荐)
删掉原来用相对路径追加sys.path的逻辑,改为通过入口脚本custom_pipeline.py的自身位置计算项目根目录,再加入搜索路径,这种写法完全不受执行时CWD影响,本地和Azure环境都能正常运行:
import sys import os # 获取当前入口脚本的所在目录绝对路径 current_dir = os.path.dirname(os.path.abspath(__file__)) # 向上回溯两级:Pipeline目录 -> Preprocess目录 -> Preprocess的父目录(项目根) project_root = os.path.abspath(os.path.join(current_dir, "../..")) sys.path.append(project_root) from Preprocess.logger import logger
方案2:修正PythonScriptStep的目录配置
检查e.sources_directory的取值,必须确保它指向**Preprocess文件夹的父目录**,而非Preprocess文件夹本身或者更深层的Pipeline目录。Azure ML会将source_directory下的全部内容上传到计算节点作为执行上下文,如果这个路径配错,执行环境里根本不会存在顶层的Preprocess文件夹,再怎么改路径也无法导入。
如果确认source_directory配置正确,也可以直接在runconfig里把CWD加入PYTHONPATH,不需要在业务代码里追加路径:
# 在run_config初始化后添加 run_config.environment.environment_variables["PYTHONPATH"] = "."
方案3:打包为本地Python包(适合生产场景)
如果后续这个模块需要在多个管道步骤里复用,可以把Preprocess模块打包为标准wheel安装包,在Azure ML的Environment配置中添加本地pip依赖,执行时会自动把包装到系统Python路径里,完全不需要手动处理sys.path。
内容的提问来源于stack exchange,提问作者Obiii
相关产品推荐
相关产品推荐

