让 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的主要内容,如果未能解决你的问题,请参考以下文章