Bazel、python3 和 python 解释器选项

JMA*_*MAA 5 python python-3.x bazel

我有一个庞大而多样的代码库,其中大部分是 python(3),我正在尝试用 bazel 组织它。

理想情况下,我希望(按重要性的大致顺序):

  1. 默认为python3(理想情况下是特定版本,但我可以只使用其中的任何内容/usr/bin/python3
  2. 将选项发送到 python 解释器,理想情况下以每个目标的方式
  3. 覆盖特定目标的python解释器和其他选项的选项

现在我有一个部分解决方案,我想就它是否惯用以及在哪里可以改进提出一些建议。

/BUILD我有

genrule(
  name = "python3_interpreter",
  outs = ["python"],
  cmd = "echo '#!/bin/bash\n/usr/bin/python3 -OO \"$$@\"\n' > $@",
  executable = True,
)
py_runtime(
  name = "python3",
  visibility = ["//visibility:public"],
  interpreter = ":python3_interpreter",
  files = []
)
Run Code Online (Sandbox Code Playgroud)

创建一个中间人 python 解释器,我可以在其中向 python 解释器添加选项(-OO在这种情况下)。

/.bazelrc我有

build --python_top=//:python3
run --python_top=//:python3
Run Code Online (Sandbox Code Playgroud)

默认为该解释器。

我可能会在 周围使用一个宏genrule来使添加解释器选项更符合人体工程学(并且可能python3以更结构化的方式进行搜索),但它仍然感觉很像黑客。

我还可以使用外部存储库从源代码下载和构建特定的 Python 版本,这需要付出更多努力,但也更加隐秘。

这些选项似乎都不是特别令人满意,也没有一个允许我覆盖每个目标的内容。

欢迎任何建议或建设性批评。我已经在使用rules_python来管理 pip 依赖项。我也在考虑使用rules_pyz,它看起来可能更容易编辑以支持我需要的其他 Python 功能(例如py_library,取决于cc_library)。