让 Bazel 使用 python 3

Posted

技术标签:

【中文标题】让 Bazel 使用 python 3【英文标题】:make Bazel use python 3 【发布时间】:2017-10-31 13:39:34 【问题描述】:

我想在 Bazel 中使用 python 3 运行我的 py_test。

py_library(
    name = "foo",
    srcs = ["foo.py"]
)

py_test(
    name = "foo_test",
    srcs = glob(["foo_test.py",]),
    deps = [":foo"]
)

py_runtime(
    name = "python-3.6.3",
    files = [],
    interpreter_path = "/usr/local/bin/python3",
)

我可以使用命令来实现这一点

bazel test --python_top=//path/to/foo:python-3.6.3 foo_test

但是,我想使用 new_http_archive 将 python3 导入到 bazel 沙箱,并为指向 bazel 沙箱中的 http_archive 的 py_runtime 规则提供解释器路径。到目前为止,我无法找到interpreter_path 是什么...我是否必须在 py_runtime 或其他地方引用 http_archive 标签?

new_http_archive(
name = "python_version",
urls = ["https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz"],
strip_prefix = "Python-3.6.3",
build_file_content = """
py_library(
    name = "python_srcs",
    srcs = glob(["Lib/*.py"]),
    visibility = ["//visibility:public"]
)"""
)

【问题讨论】:

【参考方案1】:

您下载的 tgz 不包含解释器。它包含解释器的源代码。如果您想在构建过程中构建解释器,您可以这样做

new_http_archive(
    name = "python_version",
    urls = ["https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz"],
    strip_prefix = "Python-3.6.3",
    build_file_content = """
genrule(
    name = "build_python",
    srcs = glob(["**"]),
    outs = ["python"],
    cmd = "./external/python_version/configure && make && cp python $@",
    visibility = ["//visibility:public"],
)""",
)

然后您的 py_runtime 规则将设置 interpreter 属性(不是解释器路径):

py_runtime(
    name = "python-3.6.3",
    files = [],
    interpreter = "@python_version//:python",
)

【讨论】:

谢谢,因为这种方法不是跨平台的,我会坚持使用 "/usr/local/bin/python3" ,尽管我想知道是否有办法让 Bazel 使用环境变量对于 py_home? 您关注哪些平台?这应该适用于 Linux 上的大多数类型。对于 Mac 或 Windows,您可以创建替代 new_http_archives 来获取安装程序。然后你的 py_runtime 规则可以在解释器上有一个 select 语句来根据平台选择使用哪一个。 我关心所有的平台。我找到了另一种在srcs_version ="PY3" 时使用--python_path=/usr/local/bin/python3 --force_python=py3 强制执行python 3 的方法,所以我现在将使用它(尝试让--python_path 接受环境变量),稍后可能会尝试你的方法,看看它是否有效。谢谢!

以上是关于让 Bazel 使用 python 3的主要内容,如果未能解决你的问题,请参考以下文章

如何使用vscode python调试器来调试用bazel构建的项目?

在Ubuntu上使用Java 11的Bazel

Bazel 在python上的应用

Bazel和Springboot中使用Jython的方法

没有 bazel 的 TensorFlow 启动

Bazel和Springboot中使用Jython的方法