Python 规则

规则

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 目录树中包含 Google Cloud 控制台中需要的所有代码和数据, 以及一个用于启动该程序的存根脚本 正确的初始环境和数据。

示例

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 二进制文件以设置 则正确的方法是使用另一个二进制文件或 测试依赖于其数据部分中的 py_binary。另一个 然后,二进制文件可以相对于源代码找到 py_binary 目录。

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

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

参数

属性
name

Name; required

此目标的唯一名称。


如果未指定 main,则应该与名称相同 作为应用的主要入口点的源文件 去掉扩展名。例如,如果您的入口点称为 main.py,则您的姓名应为 main
deps

List of labels; optional

要链接到二进制文件目标的其他库的列表。 查看有关 deps 的一般评论: <ph type="x-smartling-placeholder"></ph> 大多数构建规则定义的典型属性。 这些通常是 py_library 规则。
srcs

List of labels; required

为创建目标而处理的源 (.py) 文件的列表。 这包括您已签入的所有代码和所有已生成的源文件。库目标 而属于 deps,而运行时所需的其他二进制文件则属于 data
imports

List of strings; optional

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

需遵循替换 "Make variable" 的规定。这些导入 目录,以及依赖于该规则的所有规则(注意:而非 规则所依赖的规则系统会通过以下方式将每个目录添加到 PYTHONPATH: 依赖于此规则的 py_binary 规则。

绝对路径(以 / 开头的路径)和引用某个路径的路径 高于执行根目录,则会导致错误。

legacy_create_init

Integer; optional; default is -1

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

Label; optional

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

String; optional; nonconfigurable; default is "_INTERNAL_SENTINEL"

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

Python 版本始终会重置(可能默认)为 而无论在命令行中指定的版本,还是通过 依赖于此定位条件的其他更高层级的目标。

如果要对当前的 Python 版本执行 select(),您可以检查 值为 @rules_python//python:python_version。请参阅 此处

bug 警告:此属性设置 Bazel 构建目标的版本。 但由于 #4815, 生成的桩脚本可能仍会在运行时调用错误的解释器版本。请参阅 这个 解决方法,其中涉及定义一个py_runtime目标, Python 版本,py_runtime激活此产品,只需设置 --python_top

srcs_version

String; optional; default is "PY2AND3"

此属性声明目标的 srcs 与任一 Python 兼容 2 和/或 Python 3。要实际设置 Python 运行时版本,请使用 python_version 属性 可执行的 Python 规则(py_binarypy_test)。

允许的值包括:"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

Integer; optional; default is -1

是否将 build 信息编码到二进制文件中。可能的值: <ph type="x-smartling-placeholder">
    </ph>
  • stamp = 1:始终将 build 信息标记到二进制文件中,即使在 --nostamp build。 应避免使用,因为这可能会终止 二进制文件以及依赖于它的任何下游操作。
  • stamp = 0:始终用常量值替换 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

Name; required

此目标的唯一名称。

deps

List of labels; optional

要链接到二进制文件目标的其他库的列表。 查看有关 deps 的一般评论: <ph type="x-smartling-placeholder"></ph> 大多数构建规则定义的典型属性。 这些通常是 py_library 规则。
srcs

List of labels; optional

为创建目标而处理的源 (.py) 文件的列表。 这包括您已签入的所有代码和所有已生成的源文件。
imports

List of strings; optional

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

需遵循替换 "Make variable" 的规定。这些导入 目录,以及依赖于该规则的所有规则(注意:而非 规则所依赖的规则系统会通过以下方式将每个目录添加到 PYTHONPATH: 依赖于此规则的 py_binary 规则。

绝对路径(以 / 开头的路径)和引用某个路径的路径 高于执行根目录,则会导致错误。

srcs_version

String; optional; default is "PY2AND3"

此属性声明目标的 srcs 与任一 Python 兼容 2 和/或 Python 3。要实际设置 Python 运行时版本,请使用 python_version 属性 可执行的 Python 规则(py_binarypy_test)。

允许的值包括:"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

Name; required

此目标的唯一名称。

deps

List of labels; optional

要链接到二进制文件目标的其他库的列表。 查看有关 deps 的一般评论: <ph type="x-smartling-placeholder"></ph> 大多数构建规则定义的典型属性。 这些通常是 py_library 规则。
srcs

List of labels; required

为创建目标而处理的源 (.py) 文件的列表。 这包括您已签入的所有代码和所有已生成的源文件。库目标 而属于 deps,而运行时所需的其他二进制文件则属于 data
imports

List of strings; optional

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

需遵循替换 "Make variable" 的规定。这些导入 目录,以及依赖于该规则的所有规则(注意:而非 规则所依赖的规则系统会通过以下方式将每个目录添加到 PYTHONPATH: 依赖于此规则的 py_binary 规则。

绝对路径(以 / 开头的路径)和引用某个路径的路径 高于执行根目录,则会导致错误。

legacy_create_init

Integer; optional; default is -1

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

Label; optional

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

String; optional; nonconfigurable; default is "_INTERNAL_SENTINEL"

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

Python 版本始终会重置(可能默认)为 而无论在命令行中指定的版本,还是通过 依赖于此定位条件的其他更高层级的目标。

如果要对当前的 Python 版本执行 select(),您可以检查 值为 @rules_python//python:python_version。请参阅 此处

bug 警告:此属性设置 Bazel 构建目标的版本。 但由于 #4815, 生成的桩脚本可能仍会在运行时调用错误的解释器版本。请参阅 这个 解决方法,其中涉及定义一个py_runtime目标, Python 版本,py_runtime激活此产品,只需设置 --python_top

srcs_version

String; optional; default is "PY2AND3"

此属性声明目标的 srcs 与任一 Python 兼容 2 和/或 Python 3。要实际设置 Python 运行时版本,请使用 python_version 属性 可执行的 Python 规则(py_binarypy_test)。

允许的值包括:"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

Integer; optional; default is 0

请参阅 py_binary() 参数的部分,但 测试的戳记参数默认设置为 0。

py_runtime

py_runtime(name, 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 运行时。平台运行时以已知的 路径,而构建运行时指向充当解释器的可执行目标。在 “口译”或“翻译”指任何能够 运行通过命令行传递的 Python 脚本,并遵循与标准 CPython 解释器。

平台运行时本质上是非封闭的。对目标平台施加了要求 让口译工具位于特定路径。构建运行时不一定是封闭的 具体取决于它是指向已检入的解释器还是用于访问 系统解释器。

示例:

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

Name; required

此目标的唯一名称。

coverage_tool

Label; optional

这是一个目标,用于从 py_binary 收集代码覆盖率信息 和 py_test 目标。

如果设置,目标必须是生成单个文件,或者是可执行目标。 指向单个文件的路径;如果目标可执行,则为可执行文件的路径; 确定 python 覆盖率工具的入口点。目标及其 启用覆盖率功能后,系统会将 runfiles 添加到 runfile 中。

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

files

List of labels; optional

对于构建运行时,这是包含此运行时的一组文件。这些文件会 添加到使用此运行时的 Python 二进制文件的 runfile 中。对于平台运行时 请勿设置此属性。
interpreter

Label; optional

对于构建运行时,这是作为解释器调用的目标。对于平台 runtime 时,请勿设置此属性。
interpreter_path

String; optional

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

String; optional; default is "_INTERNAL_SENTINEL"

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

默认值由 --incompatible_py3_is_default 标志控制。 不过,以后此属性将会成为必需属性,并且没有默认值。

stub_shebang

String; optional; default is "#!/usr/bin/env python3"

“Shebang”附加到引导 Python 桩脚本前面的表达式 在执行 py_binary 目标时使用。

请参阅问题 8685

不适用于 Windows。