【问题标题】:Bazel build fails with msg "env: python: No such file or directory" (macOS Monterey)Bazel 构建失败并显示 msg “env: python: No such file or directory” (macOS Monterey)
【发布时间】:2022-07-17 02:40:02
【问题描述】:

我是 python 世界的新手,我已经按照几篇文章在我的系统上设置 python。我需要 python 通过 bazel 来构建我的项目。

当我在 local 上构建项目时,我收到以下错误。请注意,我能够在服务器上成功构建项目,因此问题与代码无关。

env: python: No such file or directory
INFO: Elapsed time: 1.708s, Critical Path: 1.09s
INFO: 7 processes: 4 darwin-sandbox, 3 worker.
FAILED: Build did NOT complete successfully

帮助我解决我构建失败的问题。

我试图通过在线应用解决方案来解决这个问题,但都是徒劳的。 我已经删除了我的完整 python 环境并重新配置了它,但这对我也不起作用。

这是我的系统配置:

env 中的 Python 版本为:Python 3.9.12,但在上述错误中仍然显示“env: python: No such file or directory”。

└─(13:59:50)──> /usr/bin/env python --version    
Python 3.9.12

如果我触发 /usr/bin/python3 --version 我会得到 Python 3.8.9 作为输出

└─(13:47:35)──> /usr/bin/python3 --version                   
Python 3.8.9

但是当cd 进入/usr/bin/ 并触发python3 --version 命令时,我得到Python 3.9.12 作为输出。

┌─(/usr/bin)──────────────────────────────────────────
└─(13:56:29)──> pwd                                                      
/usr/bin
┌─(/usr/bin)──────────────────────────────────────────
└─(13:56:32)──> python3 --version                                        
Python 3.9.12

另外,/usr/local/bin/python/usr/local/bin/python3 都指向 Python 3.9.12

┌─(/usr/bin)──────────────────────────────────────────
└─(13:56:41)──> /usr/local/bin/python --version       
Python 3.9.12
┌─(/usr/bin)──────────────────────────────────────────
└─(13:57:46)──> /usr/local/bin/python3 --version      
Python 3.9.12

【问题讨论】:

    标签: python python-3.x build bazel macos-monterey


    【解决方案1】:

    我也有同样的问题。这是我发现的。 Bazel 构建通常使用 py_binary 工具,这些工具是使用带有 shebang #!/usr/bin/env python 的 shell 脚本启动的(在 5 之前的版本中)。但它也会在清除PATH 环境变量的子shell 中启动它们。 (exec env - ...).

    这意味着系统路径上必须有一个python。修改您的PATH 将无济于事,也不会使用pyenv 之类的东西。要查看正在使用哪个 python,请运行 (exec env - python)。在 macOS 12.3 中,Apple 删除了/usr/bin/python。所以这失败并打印env: python: No such file or directory

    我还没有找到解决此问题的任何方法,因为 Apple 也不允许您修改 /usr/bin 以将符号链接添加到 python3,即使是 root(由于系统完整性保护)。

    这在 Bazel 5 中已修复,但我无法升级到该版本,因为我需要能够对具有需要 Bazel

    请注意,Github macOS 运行器仍在 macOS 11 上。这可能就是您的项目仍然在您的服务器上构建的原因。

    此时我被阻止了。我想我要么需要找到一种方法将 python 添加到系统 PATH(围绕 SIP 工作),要么我需要将一些更改从 Bazel 5 反向移植到 Bazel 3 并使用自定义版本的 Bazel。或者我需要在旧版本的 macOS 上进行所有开发和调试。

    【讨论】:

    【解决方案2】:

    你的分析是对的@Matthew Self。由于 MacOS 的 SIP,无法创建符号链接。即使禁用它,您也无法在 /usr/bin/... 中创建符号链接,因为它是只读的。

    更多信息在这里 - Cannot create a symlink inside of /usr/bin even as sudo


    现在我在构建默认使用 /usr/bin/python 运行任何 python 文件的 bazel 目标时也遇到了类似的问题。由于我的 bazel 版本是 3.7.1,因此在更新 OS Monterery 后它会给出与您类似的错误。

    但是使用ln -s /usr/bin/python3 /usr/local/bin/python 解决了我的问题,因为它在/usr/local/bin/... 而不是/usr/bin/... 中创建了一个符号链接,并且令人惊讶的是,bazel 默认选择了这个python 路径。

    可能是因为/usr/local/bin 会排在/usr/bin 之前,所以优先。

    【讨论】:

      【解决方案3】:

      我刚刚解决了这个问题。我使用的方法是破解 bazel 4.1.0。

      首先,查看 bazel 4.1.0 源码

      通过修改文件:src/main/java/com/google/devtools/build/lib/bazel/rules/python/python_stub_template.txt

      修改第一行

      #!/usr/bin/env python

      进入

      #!/usr/bin/env /Library/Frameworks/Python.framework/Versions/2.7/bin/python

      这里可以指定python2路径。

      最后,您在命令行中构建修改后的 bazel:

      $ bazel build //src:bazel

      您可以获得修改版的 bazel。用这个bazel代替原来的bazel,问题就解决了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-03
        • 2020-09-07
        • 2013-05-26
        • 2014-01-20
        • 1970-01-01
        • 2022-12-17
        • 2021-03-28
        • 1970-01-01
        相关资源
        最近更新 更多