Python 规则

报告问题 查看源代码 每夜 build · 8.0 . 7.47.3 · 7.2 · 7.1 · 7.0 · 6.5

规则

py_binary

查看规则源代码
py_binary(name, deps, srcs, data, args, compatible_with, deprecation, distribs, env, exec_compatible_with, exec_properties, features, imports, legacy_create_init, licenses, main, output_licenses, python_version, restricted_to, srcs_version, stamp, tags, target_compatible_with, testonly, toolchains, visibility)

py_binary 是一个可执行的 Python 程序,由一系列 .py 源文件(可能属于其他 py_library 规则)、一个包含程序在运行时所需的所有代码和数据的 *.runfiles 目录树,以及一个桩脚本(用于使用正确的初始环境和数据启动程序)组成。

示例

py_binary(
    name = "foo",
    srcs = ["foo.py"],
    data = [":transform"],  # a cc_binary which we invoke at run time
    deps = [
        ":foolib",  # a py_library
    ],
)

如果您想从其他二进制文件或测试中运行 py_binary(例如,运行 Python 二进制文件以在 java_test 中设置一些模拟资源),正确的方法是让其他二进制文件或测试依赖于其数据段中的 py_binary。然后,另一个二进制文件可以相对于源目录找到 py_binary

py_binary(
    name = "test_main",
    srcs = ["test_main.py"],
    deps = [":testing"],
)

java_library(
    name = "testing",
    srcs = glob(["*.java"]),
    data = [":test_main"]
)

参数

属性
name

名称;必需

此目标的唯一名称。


如果未指定 main,则此值应与应用的主要入口点(不含扩展名)的源文件的名称相同。例如,如果您的入口点名为 main.py,则您的名称应为 main
deps

标签列表;默认值为 []

要关联到二进制目标的其他库的列表。 如需了解 deps 的一般说明,请参阅 大多数 build 规则定义的典型属性。 这些通常是 py_library 规则。
srcs

标签列表;必需

用于创建目标而经过处理的源 (.py) 文件的列表。 这包括您已提交的所有代码和任何生成的源文件。库目标应位于 deps 中,而运行时所需的其他二进制文件应位于 data 中。
imports

字符串列表;默认值为 []

要添加到 PYTHONPATH 的导入目录列表。

需遵循“Make 变量”替换规则。系统会为此规则以及依赖于它的所有规则添加这些导入目录(注意:不是此规则依赖的规则)。每个目录都将由依赖于此规则的 py_binary 规则添加到 PYTHONPATH

不允许使用绝对路径(以 / 开头的路径)和引用执行根目录上方路径的路径,否则会导致错误。

legacy_create_init

整数;默认为 -1

是否在 runfiles 树中隐式创建空 __init__.py 文件。 这些文件会在包含 Python 源代码或共享库的每个目录以及这些目录的每个父目录(代码库根目录除外)中创建。默认值“auto”表示 true,除非使用 --incompatible_default_to_explicit_init_py。如果为 false,用户负责创建(可能为空)__init__.py 文件,并根据需要将其添加到 Python 目标的 srcs
main

标签;默认值为 None

作为应用主入口点的源文件的名称。 此文件还必须列在 srcs 中。如果未指定,则系统会改用 name(见上文)。如果 namesrcs 中的任何文件名都不匹配,则必须指定 main
python_version

字符串;不可配置;默认值为 "_INTERNAL_SENTINEL"

是否为 Python 2 或 Python 3 构建此目标(及其传递的 deps)。有效值为 "PY2""PY3"(默认值)。

无论命令行或依赖于此目标的其他更高级别目标指定了什么版本,Python 版本始终会重置(可能默认)为此属性指定的任何版本。

如果您想在当前 Python 版本上执行 select(),可以检查 @rules_python//python:python_version 的值。如需了解详情,请点击此处

错误警告:此属性用于设置 Bazel 构建目标的版本,但由于 #4815,生成的桩脚本在运行时可能仍会调用错误的解释器版本。请参阅此替代方案,其中涉及定义一个 py_runtime 目标,以根据需要指向任一 Python 版本,并通过设置 --python_top 激活此 py_runtime

srcs_version

字符串;默认值为 "PY2AND3"

此属性用于声明目标的 srcs 与 Python 2、Python 3 或两者兼容。如需实际设置 Python 运行时版本,请使用可执行 Python 规则 (py_binarypy_test) 的 python_version 属性。

允许的值包括:"PY2AND3""PY2""PY3"。 出于历史原因,也允许使用值 "PY2ONLY""PY3ONLY",但它们与 "PY2""PY3" 本质上相同,因此应避免使用。

请注意,只有可执行规则 (py_binarypy_library ) 会根据此属性的值实际验证当前的 Python 版本。 (这是一个功能;由于 py_library 不会更改当前的 Python 版本,因此如果它执行验证,则无法在同一调用中同时构建 PY2ONLYPY3ONLY 库。)此外,如果存在版本不匹配,系统只会在执行阶段报告错误。特别是,该错误不会显示在 bazel build --nobuild 调用中。)

如需获取有关哪些依赖项引入版本要求的诊断信息,您可以对目标运行 find_requirements 切面:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
这会构建一个后缀为 -pyversioninfo.txt 的文件,其中包含有关目标平台为何需要特定 Python 版本的信息。请注意,即使给定目标因版本冲突而未能构建,此方法也能正常运行。
stamp

整数;默认为 -1

是否将 build 信息编码到二进制文件中。可能的值:
  • stamp = 1:始终将 build 信息戳入二进制文件,即使在 --nostamp build 中也是如此。应避免使用此设置,因为它可能会终止二进制文件以及依赖于它的所有下游操作的远程缓存。
  • stamp = 0:始终将 build 信息替换为常量值。这可实现良好的 build 结果缓存。
  • stamp = -1:build 信息的嵌入由 --[no]stamp 标志控制。

除非其依赖项发生变化,否则不会重新构建带有标记的二进制文件。

py_library

查看规则源代码
py_library(name, deps, srcs, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, imports, licenses, restricted_to, srcs_version, tags, target_compatible_with, testonly, visibility)

参数

属性
name

名称;必需

此目标的唯一名称。

deps

标签列表;默认值为 []

要关联到二进制目标的其他库的列表。 如需了解 deps 的一般说明,请参阅 大多数 build 规则定义的典型属性。 这些通常是 py_library 规则。
srcs

标签列表;默认值为 []

用于创建目标而被处理的源 (.py) 文件的列表。 这包括您已提交的所有代码和任何生成的源文件。
imports

字符串列表;默认值为 []

要添加到 PYTHONPATH 的导入目录列表。

需遵循“Make 变量”替换规则。系统会为此规则以及依赖于它的所有规则添加这些导入目录(注意:不是此规则依赖的规则)。每个目录都将由依赖于此规则的 py_binary 规则添加到 PYTHONPATH

不允许使用绝对路径(以 / 开头的路径)和引用执行根目录上方路径的路径,否则会导致错误。

srcs_version

字符串;默认值为 "PY2AND3"

此属性用于声明目标的 srcs 与 Python 2、Python 3 或两者兼容。如需实际设置 Python 运行时版本,请使用可执行 Python 规则 (py_binarypy_test) 的 python_version 属性。

允许的值包括:"PY2AND3""PY2""PY3"。 出于历史原因,也允许使用值 "PY2ONLY""PY3ONLY",但它们与 "PY2""PY3" 本质上相同,因此应避免使用。

请注意,只有可执行规则 (py_binarypy_library ) 会根据此属性的值实际验证当前的 Python 版本。 (这是一个功能;由于 py_library 不会更改当前的 Python 版本,因此如果它执行验证,则无法在同一调用中同时构建 PY2ONLYPY3ONLY 库。)此外,如果存在版本不匹配,系统只会在执行阶段报告错误。特别是,该错误不会显示在 bazel build --nobuild 调用中。)

如需获取有关哪些依赖项引入版本要求的诊断信息,您可以对目标运行 find_requirements 切面:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
这会构建一个后缀为 -pyversioninfo.txt 的文件,其中包含有关目标平台为何需要特定 Python 版本的信息。请注意,即使给定目标因版本冲突而未能构建,此方法也能正常运行。

py_test

查看规则源代码
py_test(name, deps, srcs, data, args, compatible_with, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, imports, legacy_create_init, licenses, local, main, python_version, restricted_to, shard_count, size, srcs_version, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility)

py_test() 规则会编译测试。测试是一些测试代码的二进制封装容器。

示例

py_test(
    name = "runtest_test",
    srcs = ["runtest_test.py"],
    deps = [
        "//path/to/a/py/library",
    ],
)

您还可以指定主模块:

py_test(
    name = "runtest_test",
    srcs = [
        "runtest_main.py",
        "runtest_lib.py",
    ],
    main = "runtest_main.py",
)

参数

属性
name

名称;必需

此目标的唯一名称。

deps

标签列表;默认值为 []

要关联到二进制目标的其他库的列表。 如需了解 deps 的一般说明,请参阅 大多数 build 规则定义的典型属性。 这些通常是 py_library 规则。
srcs

标签列表;必需

用于创建目标而经过处理的源 (.py) 文件的列表。 这包括您已提交的所有代码和任何生成的源文件。库目标应位于 deps 中,而运行时所需的其他二进制文件应位于 data 中。
imports

字符串列表;默认值为 []

要添加到 PYTHONPATH 的导入目录列表。

需遵循“Make 变量”替换规则。系统会为此规则以及依赖于它的所有规则添加这些导入目录(注意:不是此规则依赖的规则)。每个目录都将由依赖于此规则的 py_binary 规则添加到 PYTHONPATH

不允许使用绝对路径(以 / 开头的路径)和引用执行根目录上方路径的路径,否则会导致错误。

legacy_create_init

整数;默认为 -1

是否在 runfiles 树中隐式创建空 __init__.py 文件。 这些文件会在包含 Python 源代码或共享库的每个目录以及这些目录的每个父目录(代码库根目录除外)中创建。默认值“auto”表示 true,除非使用 --incompatible_default_to_explicit_init_py。如果为 false,用户负责创建(可能为空)__init__.py 文件,并根据需要将其添加到 Python 目标的 srcs
main

标签;默认值为 None

作为应用主入口点的源文件的名称。 此文件还必须列在 srcs 中。如果未指定,则系统会改用 name(见上文)。如果 namesrcs 中的任何文件名都不匹配,则必须指定 main
python_version

字符串;不可配置;默认值为 "_INTERNAL_SENTINEL"

是否为 Python 2 或 Python 3 构建此目标(及其传递的 deps)。有效值为 "PY2""PY3"(默认值)。

无论命令行或依赖于此目标的其他更高级别目标指定了什么版本,Python 版本始终会重置(可能默认)为此属性指定的任何版本。

如果您想在当前 Python 版本上执行 select(),可以检查 @rules_python//python:python_version 的值。如需了解详情,请点击此处

错误警告:此属性用于设置 Bazel 构建目标的版本,但由于 #4815,生成的桩脚本在运行时可能仍会调用错误的解释器版本。请参阅此替代方案,其中涉及定义一个 py_runtime 目标,以根据需要指向任一 Python 版本,并通过设置 --python_top 激活此 py_runtime

srcs_version

字符串;默认值为 "PY2AND3"

此属性用于声明目标的 srcs 与 Python 2、Python 3 或两者兼容。如需实际设置 Python 运行时版本,请使用可执行 Python 规则 (py_binarypy_test) 的 python_version 属性。

允许的值包括:"PY2AND3""PY2""PY3"。 出于历史原因,也允许使用值 "PY2ONLY""PY3ONLY",但它们与 "PY2""PY3" 本质上相同,因此应避免使用。

请注意,只有可执行规则 (py_binarypy_library ) 会根据此属性的值实际验证当前的 Python 版本。 (这是一个功能;由于 py_library 不会更改当前的 Python 版本,因此如果它执行验证,则无法在同一调用中同时构建 PY2ONLYPY3ONLY 库。)此外,如果存在版本不匹配,系统只会在执行阶段报告错误。特别是,该错误不会显示在 bazel build --nobuild 调用中。)

如需获取有关哪些依赖项引入版本要求的诊断信息,您可以对目标运行 find_requirements 切面:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
这会构建一个后缀为 -pyversioninfo.txt 的文件,其中包含有关目标平台为何需要特定 Python 版本的信息。请注意,即使给定目标因版本冲突而未能构建,此方法也能正常运行。
stamp

整数;默认为 0

请参阅 py_binary() 实参部分,但对于测试,戳实参默认设置为 0。

py_runtime

查看规则源代码
py_runtime(name, bootstrap_template, compatible_with, coverage_tool, deprecation, distribs, features, files, interpreter, interpreter_path, licenses, python_version, restricted_to, stub_shebang, tags, target_compatible_with, testonly, visibility)

表示用于执行 Python 代码的 Python 运行时。

py_runtime 目标可以表示平台运行时内置运行时。平台运行时会访问已知路径中的系统安装的解释器,而 build 内运行时会指向用作解释器的可执行目标。在这两种情况下,“解释器”是指能够按照与标准 CPython 解释器相同的惯例,运行在命令行上传递的 Python 脚本的任何可执行二进制文件或封装容器脚本。

平台运行时本质上是非密封的。它要求目标平台上的解释器位于特定路径。构建时运行时可以是密封的,也可以不是,具体取决于它是指向已签入的解释器,还是指向访问系统解释器的封装容器脚本。

示例:

py_runtime(
    name = "python-2.7.12",
    files = glob(["python-2.7.12/**"]),
    interpreter = "python-2.7.12/bin/python",
)

py_runtime(
    name = "python-3.6.0",
    interpreter_path = "/opt/pyenv/versions/3.6.0/bin/python",
)

参数

属性
name

名称;必需

此目标的唯一名称。

bootstrap_template

标签;默认值为 "@bazel_tools//tools/python:python_bootstrap_template.txt"

以前称为“Python 桩脚本”,这是每个 Python 可执行目标的入口点。
coverage_tool

标签;默认值为 None

这是用于从 py_binarypy_test 目标收集代码覆盖率信息的目标。

如果设置,目标必须生成单个文件,或者是可执行目标。 单个文件的路径(如果目标是可执行文件,则为可执行文件的路径)决定了 Python 代码覆盖率工具的入口点。启用代码覆盖率后,目标及其运行文件将被添加到运行文件中。

工具的入口点必须可由 Python 解释器加载(例如 .py.pyc 文件)。它必须接受 coverage.py 的命令行参数,至少包括 runlcov 子命令。

files

标签列表;默认值为 []

对于 build 内运行时,这是构成此运行时的一组文件。这些文件将添加到使用此运行时的 Python 二进制文件的 runfile 中。对于平台运行时,不得设置此属性。
interpreter

标签;默认值为 None

对于 build 内运行时,这是要作为解释器调用的目标。对于平台运行时,不得设置此属性。
interpreter_path

字符串;默认值为 ""

对于平台运行时,这是目标平台上 Python 解释器的绝对路径。对于 build 内运行时,不得设置此属性。
python_version

字符串;默认值为 "_INTERNAL_SENTINEL"

此运行时是否适用于 Python 主要版本 2 或 3。有效值为 "PY2""PY3"

默认值由 --incompatible_py3_is_default 标志控制。 不过,将来此属性将变为必需属性,且没有默认值。

stub_shebang

字符串;默认值为 "#!/usr/bin/env python3"

附加到引导加载程序 Python 脚本开头的“Shebang”表达式,用于执行 py_binary 目标。

如需了解原因,请参阅问题 8685

不适用于 Windows。