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

Bazel测试依赖本地OpenSSL包失败,沙箱运行问题排查

问题解答:Bazel测试未在沙箱运行,报错指向本地系统Python模块

这种情况完全不正常——Bazel的核心特性之一就是通过沙箱隔离构建/测试环境,避免依赖本地系统的未管理依赖。你的测试报错直接指向/usr/lib/python3/dist-packages/OpenSSL/SSL.py,说明测试过程中Python没有使用Bazel为目标构建的封闭依赖环境,而是偷偷加载了本地系统的OpenSSL模块,这大概率是依赖管理配置出了问题。

为什么会出现这个问题?

你的测试代码依赖的requests、urllib3间接引入了pyopenssl,但这个pyopenssl没有被Bazel纳入依赖管理范围。当Bazel构建测试目标时,没有把正确的pyopenssl包放进测试的runfiles目录,导致Python在找不到Bazel提供的依赖时, fallback到了系统的site-packages路径。而系统安装的pyopenssl和cryptography版本不匹配,才触发了AttributeError: module 'lib' has no attribute 'Cryptography_HAS_TLSEXT_HOSTNAME'这个具体错误。

如何修复并确保测试在沙箱中运行?

这里有几个关键步骤来解决问题:

  • 用Bazel管理所有Python依赖
    确保你的项目通过pip_parse(推荐现代Bazel版本)或pip_install规则管理所有Python依赖,包括间接依赖的pyopenssl。把pyopenssl明确添加到你的requirements.txt中,然后重新生成Bazel依赖规则,让Bazel负责拉取、构建并提供这个包给测试目标。

  • 检查测试目标的依赖配置
    打开你的BUILD文件,确认//master:master_impl_test目标的deps包含了所有必要的依赖,包括py_deps//pypi__pyopenssl(具体标签根据你的依赖规则生成路径调整),确保Bazel会把这个包放进测试的runfiles里。

  • 验证沙箱是否正常启用
    Bazel在Linux上默认启用沙箱,但有时候可能被命令行参数或配置文件禁用。你可以通过以下命令强制启用沙箱并调试:

    bazel test --sandbox_debug --nocache_test_results //master:master_impl_test
    

    查看输出中的沙箱执行日志,确认测试是在沙箱环境中运行的。如果之前有--no-sandbox参数,要移除它。

  • 清理缓存并重新构建
    旧的缓存可能残留了错误的依赖路径,执行以下命令彻底清理后重新测试:

    bazel clean --expunge
    bazel test //master:master_impl_test
    
  • 确保Python版本兼容
    检查你的Bazel Python规则配置的python_version是否和依赖包兼容,比如如果pyopenssl需要Python 3.8+,而你的Bazel配置用了更低版本,也可能导致依赖加载异常。

内容的提问来源于stack exchange,提问作者Piotr Jachowicz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:39:40