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)
Apy_binary is an executable Python program consisting of a collection of.py source files (possibly belonging to otherpy_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.
py_binary( name = "foo", srcs = ["foo.py"], data = [":transform"], # a cc_binary which we invoke at run time deps = [ ":foolib", # a py_library ],)
If you want to run apy_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 thepy_binary in its data section. The other binary can then locate thepy_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"])
| 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 calledmain.py, then your name should bemain. |
deps |
deps at Attributes common to all build rules. These are generallypy_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 indeps instead, while other binary files needed at runtime belong indata. |
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 thesrcs of Python targets as required. |
main |
srcs. If left unspecified,name is used instead (see above). Ifname does not match any filename insrcs,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. Seethis 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 thepython_version attribute of an executable Python rule (py_binary orpy_test).Allowed values are: Note that only the executable rules ( 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 |
Stamped binaries arenot rebuilt unless their dependencies change. |
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)
| Attributes | |
|---|---|
name |
A unique name for this target. |
deps |
deps at Attributes common to all build rules. These are generallypy_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 thepython_version attribute of an executable Python rule (py_binary orpy_test).Allowed values are: Note that only the executable rules ( 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(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)
Apy_test() rule compiles a test. A test is a binary wrapper around some test code.
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",)
| Attributes | |
|---|---|
name |
A unique name for this target. |
deps |
deps at Attributes common to all build rules. These are generallypy_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 indeps instead, while other binary files needed at runtime belong indata. |
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 thesrcs of Python targets as required. |
main |
srcs. If left unspecified,name is used instead (see above). Ifname does not match any filename insrcs,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. Seethis 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 thepython_version attribute of an executable Python rule (py_binary orpy_test).Allowed values are: Note that only the executable rules ( 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(name,compatible_with,deprecation,distribs,features,files,interpreter,interpreter_path,licenses,python_version,restricted_to,stub_shebang,tags,target_compatible_with,testonly,visibility)
Represents a Python runtime used to execute Python code.
Apy_runtime target can represent either aplatform runtime or anin-build runtime. A platform runtime accesses a system-installed interpreter at a knownpath, whereas an in-build runtime points to an executable target that acts as the interpreter. Inboth cases, an "interpreter" means any executable binary or wrapper script that is capable ofrunning a Python script passed on the command line, following the same conventions as the standardCPython interpreter.
A platform runtime is by its nature non-hermetic. It imposes a requirement on the target platformto 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 thesystem interpreter.
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",)
| Attributes | |
|---|---|
name |
A unique name for this target. |
files |
|
interpreter |
|
interpreter_path |
|
python_version |
"PY2" and"PY3".The default value is controlled by the |
stub_shebang |
py_binary targets.Seeissue 8685 for motivation. Does not apply to Windows. |