Azure Databricks中通过get_ipython调用%run报文件不存在错误
Azure Databricks 代码形式调用
run_line_magic复刻%run导入的报错排查 问题场景
- 目标待导入模块
mynbk.py与当前运行的myfile笔记本处于同一工作区目录层级 - 直接在单元格内执行魔法命令
%run ./mynbk,可正常完成导入、无运行异常 - 替换为Python代码形式调用
get_ipython().run_line_magic('run', './mynbk')时,抛出报错:Exception: File './mynbk.py' not found,无法达成预期导入效果
根因定位
Databricks 环境中两种调用方式的相对路径解析基准不一致:
- 单元格内直接书写的
%run ./xxx语法,默认以当前笔记本所在的工作区路径为相对路径解析根,可正常定位同目录文件 - 通过Python代码调用
get_ipython().run_line_magic时,相对路径的解析基准会切换为集群驱动节点的本地进程工作目录(通常为/databricks/driver这类本地系统路径),自然无法定位到工作区中的文件
解决方法
方法1:动态拼接工作区绝对路径作为入参
利用Databricks内置的上下文接口获取当前笔记本的工作区路径,计算目标模块的完整路径后传入:import dbutils # 获取当前笔记本的完整工作区路径 current_nbk_path = dbutils.notebook.entry_point.getDbutils().notebook().getContext().notebookPath().get() # 取当前笔记本所在的目录,拼接目标模块名 target_nbk_full_path = f"{current_nbk_path.rsplit('/', 1)[0]}/mynbk" # 调用魔法命令 get_ipython().run_line_magic('run', target_nbk_full_path)该方式的路径解析逻辑和原生
%run ./mynbk完全对齐,可避免路径解析偏差。方法2:传入带Workspace前缀的显式绝对路径
如果已知当前目录的固定工作区路径,可直接将相对路径替换为工作区绝对路径作为入参,例如:get_ipython().run_line_magic('run', '/Workspace/你的目录路径/mynbk')方法3:使用
dbutils.notebook接口替代魔法命令调用
如果需要在代码逻辑中动态触发笔记本运行/导入,可直接使用Databricks原生的笔记本运行接口,其默认相对路径解析逻辑和%run一致:# 接口默认以当前笔记本路径为根解析相对路径 dbutils.notebook.run("./mynbk", timeout_seconds=60)
注意事项
- Databricks的
%run命令会自动匹配同路径下的笔记本文件,传入路径时不需要手动追加.py后缀,手动追加反而可能触发文件识别失败 - 传入
run_line_magic的路径必须指向/Workspace/下的工作区路径,仅写本地相对路径无法被Databricks的笔记本运行逻辑识别
内容的提问来源于stack exchange,提问作者Nodame
相关产品推荐
相关产品推荐

