Python Rules
Rules
py_binary
py_binary(name, deps, srcs, data, args, compatible_with, 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 main is 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 called
main.py , then your name should be main .
|
deps
|
deps at
Attributes common to all build rules.
These are generally
py_library rules.
|
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 in deps instead, while other binary files needed at runtime belong in
data .
|
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_py is used. If false, the user is
responsible for creating (possibly empty) __init__.py files and adding them to the
srcs of Python targets as required.
|
main
|
srcs . If left unspecified,
name is used instead (see above). If name does not
match any filename in srcs , main must be specified.
|
python_version
|
deps ) for Python 2 or Python
3. Valid values are "PY2" and "PY3" (the default).
The Python version is always reset (possibly by default) to whatever version is specified by this attribute, regardless of the version specified on the command line or by other higher targets that depend on this one. 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
|
srcs to be compatible with either Python
2, Python 3, or both. To actually set the Python runtime version, use the
python_version attribute of an
executable Python rule (py_binary or py_test ).
Allowed values are: Note that only the executable rules ({@code py_binary} and {@code py_library}) actually verify the current Python version against the value of this attribute. (This is a feature; since {@code py_library} does not change the current Python version, if it did the validation, it'd be impossible to build both {@code PY2ONLY} and {@code PY3ONLY} libraries in the same invocation.) Furthermore, if there is a version mismatch, the error is only reported in the execution phase. In particular, the error will not appear in a {@code bazel build --nobuild} invocation.) 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=pyversioninfoThis will build a file with the suffix -pyversioninfo.txt giving 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
|
deps at
Attributes common to all build rules.
These are generally
py_library rules.
|
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
|
srcs to be compatible with either Python
2, Python 3, or both. To actually set the Python runtime version, use the
python_version attribute of an
executable Python rule (py_binary or py_test ).
Allowed values are: Note that only the executable rules ({@code py_binary} and {@code py_library}) actually verify the current Python version against the value of this attribute. (This is a feature; since {@code py_library} does not change the current Python version, if it did the validation, it'd be impossible to build both {@code PY2ONLY} and {@code PY3ONLY} libraries in the same invocation.) Furthermore, if there is a version mismatch, the error is only reported in the execution phase. In particular, the error will not appear in a {@code bazel build --nobuild} invocation.) 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=pyversioninfoThis will build a file with the suffix -pyversioninfo.txt giving 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, 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
|
deps at
Attributes common to all build rules.
These are generally
py_library rules.
|
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 in deps instead, while other binary files needed at runtime belong in
data .
|
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_py is used. If false, the user is
responsible for creating (possibly empty) __init__.py files and adding them to the
srcs of Python targets as required.
|
main
|
srcs . If left unspecified,
name is used instead (see above). If name does not
match any filename in srcs , main must be specified.
|
python_version
|
deps ) for Python 2 or Python
3. Valid values are "PY2" and "PY3" (the default).
The Python version is always reset (possibly by default) to whatever version is specified by this attribute, regardless of the version specified on the command line or by other higher targets that depend on this one. 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
|
srcs to be compatible with either Python
2, Python 3, or both. To actually set the Python runtime version, use the
python_version attribute of an
executable Python rule (py_binary or py_test ).
Allowed values are: Note that only the executable rules ({@code py_binary} and {@code py_library}) actually verify the current Python version against the value of this attribute. (This is a feature; since {@code py_library} does not change the current Python version, if it did the validation, it'd be impossible to build both {@code PY2ONLY} and {@code PY3ONLY} libraries in the same invocation.) Furthermore, if there is a version mismatch, the error is only reported in the execution phase. In particular, the error will not appear in a {@code bazel build --nobuild} invocation.) 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=pyversioninfoThis will build a file with the suffix -pyversioninfo.txt giving 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 |