Python Rules
Rules
py_binary
py_binary(name, deps, srcs, data, args, compatible_with, default_python_version, deprecation, distribs, exec_compatible_with, exec_properties, features, imports, legacy_create_init, licenses, main, output_licenses, python_version, restricted_to, srcs_version, stamp, tags, testonly, toolchains, visibility)
  A py_binary is an executable Python program consisting
  of a collection of .py source files (possibly belonging
  to other py_library rules), a *.runfiles
  directory tree containing all the code and data needed by the
  program at run-time, and a stub script that starts up the program with
  the correct initial environment and data.
Examples
py_binary(
    name = "foo",
    srcs = ["foo.py"],
    data = [":transform"],  # a cc_binary which we invoke at run time
    deps = [
        "//pyglib",
        ":foolib",  # a py_library
    ],
)
If you want to run a py_binary from within another binary or
   test (for example, running a python binary to set up some mock resource from
   within a java_test) then the correct approach is to make the other binary or
   test depend on the py_binary in its data section. The other
   binary can then locate the py_binary relative to the source
   directory.
py_binary(
    name = "test_main",
    srcs = ["test_main.py"],
    deps = [":testlib"],
)
java_library(
    name = "testing",
    srcs = glob(["*.java"]),
    data = [":test_main"]
)
  Arguments
| Attributes | |
|---|---|
| name | 
 A unique name for this target. If mainis unspecified, this should be the same as the name
    of the source file that is the main entry point of the application,
    minus the extension.  For example, if your entry point is calledmain.py, then your name should bemain. | 
| deps | 
 depsat
          
          Attributes common to all build rules.
          These are generallypy_libraryrules. | 
| srcs | 
 .py) files that are processed to create the target.
          This includes all your checked-in code and any generated source files. Library targets
          belong indepsinstead, while other binary files needed at runtime belong indata. | 
| default_python_version | 
 python_version; use that instead. This attribute is
          disabled under--incompatible_remove_old_python_version_api. For migration
          purposes, ifpython_versionis given then the value ofdefault_python_versionis ignored. | 
| imports | 
 PYTHONPATH.
          Subject to "Make variable" substitution. These import
          directories will be added for this rule and all rules that depend on it (note: not the
          rules this rule depends on. Each directory will be added to  
          Absolute paths (paths that start with  | 
| legacy_create_init | 
 --incompatible_default_to_explicit_init_pyis used. If false, the user is
          responsible for creating (possibly empty) __init__.py files and adding them to thesrcsof Python targets as required. | 
| main | 
 srcs. If left unspecified,nameis used instead (see above). Ifnamedoes not
          match any filename insrcs,mainmust be specified. | 
| python_version | 
 deps) for Python 2 or Python
          3. Valid values are"PY2"and"PY3"(the default).Under the old semantics
          ( Under the new semantics
          ( If you want to  Bug warning: This attribute sets the version for which Bazel builds your target,
          but due to #4815, the
          resulting stub script may still invoke the wrong interpreter version at runtime. See
          this
          workaround, which involves defining a  | 
| srcs_version | 
 srcsto be compatible with either Python
          2, Python 3, or both. To actually set the Python runtime version, use thepython_versionattribute of an
          executable Python rule (py_binaryorpy_test).Allowed values are:  Under the old semantics
          ( To get diagnostic information about which dependencies introduce version requirements,
          you can run the  
          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          This will build a file with the suffix-pyversioninfo.txtgiving information
          about why your target requires one Python version or another. Note that it works even if
          the given target failed to build due to a version conflict. | 
| 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, testonly, visibility)
Arguments
| Attributes | |
|---|---|
| name | 
 A unique name for this target. | 
| deps | 
 depsat
          
          Attributes common to all build rules.
          These are generallypy_libraryrules. | 
| srcs | 
 .py) files that are processed to create the target.
        This includes all your checked-in code and any generated source files. | 
| imports | 
 PYTHONPATH.
          Subject to "Make variable" substitution. These import
          directories will be added for this rule and all rules that depend on it (note: not the
          rules this rule depends on. Each directory will be added to  
          Absolute paths (paths that start with  | 
| srcs_version | 
 srcsto be compatible with either Python
          2, Python 3, or both. To actually set the Python runtime version, use thepython_versionattribute of an
          executable Python rule (py_binaryorpy_test).Allowed values are:  Under the old semantics
          ( To get diagnostic information about which dependencies introduce version requirements,
          you can run the  
          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          This will build a file with the suffix-pyversioninfo.txtgiving information
          about why your target requires one Python version or another. Note that it works even if
          the given target failed to build due to a version conflict. | 
py_test
py_test(name, deps, srcs, data, args, compatible_with, default_python_version, deprecation, distribs, 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, testonly, timeout, toolchains, visibility)
A py_test() rule compiles a test.  A test is a binary wrapper
 around some test code.
Examples
py_test(
    name = "runtest_test",
    srcs = ["runtest_test.py"],
    deps = [
        "//path/to/a/py/library",
    ],
)
It's also possible to specify a main module:
py_test(
    name = "runtest_test",
    srcs = [
        "runtest_main.py",
        "runtest_lib.py",
    ],
    main = "runtest_main.py",
)
  Arguments
| Attributes | |
|---|---|
| name | 
 A unique name for this target. | 
| deps | 
 depsat
          
          Attributes common to all build rules.
          These are generallypy_libraryrules. | 
| srcs | 
 .py) files that are processed to create the target.
          This includes all your checked-in code and any generated source files. Library targets
          belong indepsinstead, while other binary files needed at runtime belong indata. | 
| default_python_version | 
 python_version; use that instead. This attribute is
          disabled under--incompatible_remove_old_python_version_api. For migration
          purposes, ifpython_versionis given then the value ofdefault_python_versionis ignored. | 
| imports | 
 PYTHONPATH.
          Subject to "Make variable" substitution. These import
          directories will be added for this rule and all rules that depend on it (note: not the
          rules this rule depends on. Each directory will be added to  
          Absolute paths (paths that start with  | 
| legacy_create_init | 
 --incompatible_default_to_explicit_init_pyis used. If false, the user is
          responsible for creating (possibly empty) __init__.py files and adding them to thesrcsof Python targets as required. | 
| main | 
 srcs. If left unspecified,nameis used instead (see above). Ifnamedoes not
          match any filename insrcs,mainmust be specified. | 
| python_version | 
 deps) for Python 2 or Python
          3. Valid values are"PY2"and"PY3"(the default).Under the old semantics
          ( Under the new semantics
          ( If you want to  Bug warning: This attribute sets the version for which Bazel builds your target,
          but due to #4815, the
          resulting stub script may still invoke the wrong interpreter version at runtime. See
          this
          workaround, which involves defining a  | 
| srcs_version | 
 srcsto be compatible with either Python
          2, Python 3, or both. To actually set the Python runtime version, use thepython_versionattribute of an
          executable Python rule (py_binaryorpy_test).Allowed values are:  Under the old semantics
          ( To get diagnostic information about which dependencies introduce version requirements,
          you can run the  
          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          This will build a file with the suffix-pyversioninfo.txtgiving information
          about why your target requires one Python version or another. Note that it works even if
          the given target failed to build due to a version conflict. | 
| stamp | 
 | 
py_runtime
py_runtime(name, compatible_with, deprecation, distribs, features, files, interpreter, interpreter_path, licenses, python_version, restricted_to, tags, testonly, visibility)
Represents a Python runtime used to execute Python code.
A py_runtime target can represent either a platform runtime or an
in-build runtime. A platform runtime accesses a system-installed interpreter at a known
path, whereas an in-build runtime points to an executable target that acts as the interpreter. In
both cases, an "interpreter" means any executable binary or wrapper script that is capable of
running a Python script passed on the command line, following the same conventions as the standard
CPython interpreter.
A platform runtime is by its nature non-hermetic. It imposes a requirement on the target platform to have an interpreter located at a specific path. An in-build runtime may or may not be hermetic, depending on whether it points to a checked-in interpreter or a wrapper script that accesses the system interpreter.
Example:
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",
)
  Arguments
| Attributes | |
|---|---|
| name | 
 A unique name for this target. | 
| files | 
 | 
| interpreter | 
 | 
| interpreter_path | 
 | 
| python_version | 
 "PY2"and"PY3".The default value is controlled by the  |