Databricks笔记本用pytest执行单元测试遇权限错误求助
Databricks中pytest执行单元测试权限错误的解决建议
问题说明
在Databricks笔记本中按照官方指南运行pytest执行单元测试时,出现如下权限错误:
PermissionError: [Errno 1] Operation not permitted: '/Workspace//Repos/<email_address>/Databricks-Code-Repo/Databricks-Code-Repo'
测试环境中,笔记本位于Databricks Repos下,同时存在两个相关笔记本:
functions:定义三个数据转换函数test_functions:对应上述函数的测试函数
错误根源
错误路径中出现重复的Databricks-Code-Repo,是路径拼接逻辑错误导致:
notebook_path本身是/Workspace/Repos/<email_address>/Databricks-Code-Repo/xxx格式- 两次调用
os.path.dirname获取的repo_root已经是/Workspace/Repos/<email_address>/Databricks-Code-Repo - 后续拼接
repo_name后,路径变成/Workspace/<repo_root>/<repo_name>,最终导致路径重复,系统无法识别该路径,触发权限错误
解决步骤
1. 修正路径拼接逻辑
调整代码中工作目录的切换逻辑,直接使用正确的repo根目录:
import pytest import os import sys # 获取当前笔记本路径 notebook_path = dbutils.notebook.entry_point.getDbutils().notebook().getContext().notebookPath().get() # 根据笔记本在repo中的位置调整dirname次数: # - 若笔记本在repo根目录,用1次dirname;若在子文件夹,增加次数 repo_root = os.path.dirname(notebook_path) # 切换到repo根目录 os.chdir(repo_root) print(os.getcwd()) # 禁止生成pyc文件 sys.dont_write_bytecode = True # 运行pytest,指定测试范围 retcode = pytest.main([".", "-v", "-p", "no:cacheprovider"]) # 断言测试结果 assert retcode == 0, "The pytest invocation failed. See the log for details."
2. 验证路径正确性
先运行以下代码确认路径是否正确,避免再次拼接错误:
notebook_path = dbutils.notebook.entry_point.getDbutils().notebook().getContext().notebookPath().get() print(f"Notebook path: {notebook_path}") repo_root = os.path.dirname(notebook_path) print(f"Repo root: {repo_root}")
3. 适配Databricks笔记本测试
pytest默认识别.py文件,若functions和test_functions是Databricks笔记本(.ipynb),需做以下调整:
- 将函数和测试代码导出为
.py文件,放到Repos目录下 - 或者使用
ipytest插件来运行笔记本中的测试(需先安装插件)
4. 确认目录权限
确保你的Databricks用户对/Workspace/Repos/<email_address>/Databricks-Code-Repo目录拥有读写权限,避免因权限不足导致执行失败
内容的提问来源于stack exchange,提问作者lyubol
相关产品推荐
相关产品推荐

