Databricks使用PythonScriptStep()时提示找不到scoring.py文件
Databricks 流水线PythonScriptStep无法定位脚本问题排查
问题复现
在Databricks中使用PythonScriptStep()定义流水线步骤时,已显式配置source_directory参数指向脚本所在目录,但运行时始终在/databricks/driver/路径下查找目标脚本,抛出文件不存在错误。受业务规则限制,无法替换使用DatabricksStep()实现功能。
问题配置代码
scoring_step = PythonScriptStep( name="Scoring_Step", source_directory=os.getenv("DATABRICKS_NOTEBOOK_PATH", "/Users/USER_NAME/source_directory"), script_name="./scoring.py", arguments=["--input_dataset", ds_consumption], compute_target=pipeline_cluster, runconfig=pipeline_run_config, allow_reuse=False)
报错信息
Step [Scoring_Step]: script not found at: /databricks/driver/scoring.py. Make sure to specify an appropriate source_directory on the Step or default_source_directory on the Pipeline.
根因分析
配置不生效是三个常见问题叠加导致:
script_name参数不支持相对路径前缀,传入./scoring.py时,SDK会直接跳过source_directory路径拼接逻辑,强制在当前进程工作目录(即Databricks Driver默认路径/databricks/driver)查找文件。source_directory参数仅识别Driver节点本地文件系统的绝对路径,传入的/Users/USER_NAME/xxx是Databricks工作区的虚拟路径,DATABRICKS_NOTEBOOK_PATH环境变量取到的也是工作区Notebook路径,都不属于本地文件系统路径,SDK识别到无效路径后会自动fallback到默认工作目录。- 若
runconfig对应的RunConfiguration对象、或Pipeline初始化时配置了default_source_directory,优先级会高于步骤级传入的source_directory,如果这两个位置留空或配置错误,也会导致路径配置失效。
修复方案
按以下顺序调整配置即可:
- 修正
script_name参数,删除./前缀,直接传入文件名:script_name="scoring.py" - 替换
source_directory为Driver本地可访问的绝对路径:- 若脚本存放在DBFS,使用
/dbfs/开头的本地挂载路径,例如脚本在DBFS的/FileStore/pipeline_scripts/目录下,对应本地路径为/dbfs/FileStore/pipeline_scripts/ - 若脚本存放在工作区目录,可先通过shell命令复制到本地临时目录再引用,例如执行
%sh mkdir -p /tmp/pipeline_scripts && cp /Workspace/Users/USER_NAME/source_directory/scoring.py /tmp/pipeline_scripts/后,source_directory设为/tmp/pipeline_scripts
- 若脚本存放在DBFS,使用
- 检查
pipeline_run_config与Pipeline初始化参数,删除冲突的source_directory/default_source_directory配置,或确保配置的路径和步骤级路径一致。
修正后参考代码
import os # 确保该路径为Driver本地可访问的绝对路径,且路径下存在scoring.py source_dir = "/dbfs/FileStore/pipeline_scripts/source_directory" scoring_step = PythonScriptStep( name="Scoring_Step", source_directory=source_dir, script_name="scoring.py", arguments=["--input_dataset", ds_consumption], compute_target=pipeline_cluster, runconfig=pipeline_run_config, allow_reuse=False )
内容的提问来源于stack exchange,提问作者nataliefoerster
相关产品推荐
相关产品推荐

