You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,是路径拼接逻辑错误导致:

  1. notebook_path本身是/Workspace/Repos/<email_address>/Databricks-Code-Repo/xxx格式
  2. 两次调用os.path.dirname获取的repo_root已经是/Workspace/Repos/<email_address>/Databricks-Code-Repo
  3. 后续拼接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:10:22