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 は、.py ソースファイル(他の py_library ルールに属している可能性があります)、実行時にプログラムが必要とするすべてのコードとデータを含む *.runfiles ディレクトリ ツリー、正しい初期環境とデータでプログラムを起動するスタブ スクリプトで構成される Python 実行可能なプログラムです。

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 = [":testlib"],
)

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

引数

属性
name

Name; required

このターゲットの一意の名前。


main を指定していない場合は、アプリのメイン エントリ ポイントであるソースファイルから拡張子を除いた名前と同じにする必要があります。たとえば、エントリ ポイントの名前が main.py の場合、名前は main にします。
deps

List of labels; optional

バイナリ ターゲットにリンクする他のライブラリのリスト。 ほとんどのビルドルールによって定義される一般的な属性deps に関する一般的なコメントをご覧ください。 通常、これらは py_library ルールです。
srcs

List of labels; required

ターゲットを作成するために処理されたソース(.py)ファイルのリスト。これには、チェックインしたすべてのコードと生成されたソースファイルが含まれます。ライブラリ ターゲットは deps に属しますが、実行時に必要な他のバイナリ ファイルは data に属します。
imports

List of strings; optional

PYTHONPATH に追加するインポート ディレクトリのリスト。

"Make variable" 置換を実行します。これらのインポート ディレクトリは、このルールとそれに依存するすべてのルールに追加されます(注: このルールが依存するルールではありません。各ディレクトリは、このルールに依存する py_binary ルールによって PYTHONPATH に追加されます。

絶対パス(/ で始まるパス)と、実行ルートより上位のパスを参照するパスは許可されず、エラーが発生します。

legacy_create_init

Integer; optional; default is -1

runfiles ツリーに空の __init__.py ファイルを暗黙的に作成するかどうかを指定します。これらのファイルは、Python ソースコードまたは共有ライブラリが含まれているすべてのディレクトリと、それらのディレクトリのすべての親ディレクトリ(リポジトリのルート ディレクトリを除く)に作成されます。デフォルトの auto は、--incompatible_default_to_explicit_init_py を使用しない限り true を意味します。false の場合、ユーザーは __init__.py ファイル(空の可能性もあります)を作成し、必要に応じて Python ターゲットの srcs に追加する必要があります。
main

Label; optional

アプリケーションのメイン エントリ ポイントであるソースファイルの名前。このファイルは、srcs にもリストされている必要があります。指定しない場合は、代わりに name が使用されます(上記参照)。namesrcs 内のどのファイル名とも一致しない場合は、main を指定する必要があります。
python_version

String; optional; nonconfigurable; default is "_INTERNAL_SENTINEL"

Python 2 または Python 3 用にこのターゲット(およびその推移的な deps)をビルドするかどうか。有効な値は "PY2""PY3"(デフォルト)です。

Python のバージョンは、コマンドラインや、これに依存する他の上位ターゲットで指定されたバージョンに関係なく、この属性で指定されたバージョンに常にリセットされます(デフォルトでこのバージョンが使用されます)。

現在の Python バージョンで select() を行う場合は、@rules_python//python:python_version の値を調べます。詳しくはこちらをご覧ください。

バグ警告: この属性は、Bazel がターゲットをビルドするバージョンを設定しますが、#4815 により、生成されるスタブ スクリプトが実行時に間違ったインタープリタのバージョンを呼び出す可能性があります。こちらの回避策をご覧ください。この方法では、必要に応じていずれかの Python バージョンを指す py_runtime ターゲットを定義し、--python_top を設定してこの py_runtime を有効にします。

srcs_version

String; optional; default is "PY2AND3"

この属性は、ターゲットの srcs が Python 2、Python 3、またはその両方と互換性を持つように宣言します。実際に Python ランタイム バージョンを設定するには、Python 実行ルール(py_binary または py_test)の python_version 属性を使用します。

使用できる値は "PY2AND3""PY2""PY3" です。歴史的な理由から "PY2ONLY""PY3ONLY" という値も使用できますが、基本的には "PY2""PY3" と同じであるため、使用を避ける必要があります。

現在の Python バージョンをこの属性の値に照らして実際に検証するのは、実行可能ルール(py_binarypy_library )だけです。(これは機能です。py_library は現在の Python バージョンを変更しないため、検証を行った場合、同じ呼び出しで PY2ONLY ライブラリと PY3ONLY ライブラリの両方をビルドすることはできません)。さらに、バージョンの不一致がある場合、エラーは実行フェーズでのみ報告されます。特に、bazel build --nobuild の呼び出しでエラーは表示されません。)

どの依存関係にバージョン要件が生じるかについての診断情報を取得するには、ターゲットで find_requirements アスペクトを実行します。

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
これにより、ターゲットにいずれかの Python バージョンが必要な理由に関する情報を示す接尾辞 -pyversioninfo.txt の付いたファイルがビルドされます。バージョンの競合が原因で指定されたターゲットのビルドに失敗した場合でも、機能します。

stamp

Integer; optional; default is -1

ビルド情報をバイナリにエンコードするかどうか。取得される値は次のとおりです。
  • stamp = 1: --nostamp ビルドの場合でも、常にビルド情報をバイナリにスタンプします。この設定は、バイナリとそれに依存するダウンストリーム アクションのリモート キャッシュを強制終了する可能性があるため、使用しないでください
  • stamp = 0: ビルド情報を常に定数値に置き換えます。これにより、良好なビルド結果のキャッシュ保存ができます。
  • stamp = -1: ビルド情報の埋め込みは --[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 に関する一般的なコメントをご覧ください。 通常、これらは py_library ルールです。
srcs

List of labels; optional

ターゲットを作成するために処理されたソース(.py)ファイルのリスト。これには、チェックインしたすべてのコードと、生成されたソースファイルが含まれます。
imports

List of strings; optional

PYTHONPATH に追加するインポート ディレクトリのリスト。

"Make variable" 置換を実行します。これらのインポート ディレクトリは、このルールとそれに依存するすべてのルールに追加されます(注: このルールが依存するルールではありません。各ディレクトリは、このルールに依存する py_binary ルールによって PYTHONPATH に追加されます。

絶対パス(/ で始まるパス)と、実行ルートより上位のパスを参照するパスは許可されず、エラーが発生します。

srcs_version

String; optional; default is "PY2AND3"

この属性は、ターゲットの srcs が Python 2、Python 3、またはその両方と互換性を持つように宣言します。実際に Python ランタイム バージョンを設定するには、Python 実行ルール(py_binary または py_test)の python_version 属性を使用します。

使用できる値は "PY2AND3""PY2""PY3" です。歴史的な理由から "PY2ONLY""PY3ONLY" という値も使用できますが、基本的には "PY2""PY3" と同じであるため、使用を避ける必要があります。

現在の Python バージョンをこの属性の値に照らして実際に検証するのは、実行可能ルール(py_binarypy_library )だけです。(これは機能です。py_library は現在の Python バージョンを変更しないため、検証を行った場合、同じ呼び出しで PY2ONLY ライブラリと PY3ONLY ライブラリの両方をビルドすることはできません)。さらに、バージョンの不一致がある場合、エラーは実行フェーズでのみ報告されます。特に、bazel build --nobuild の呼び出しでエラーは表示されません。)

どの依存関係にバージョン要件が生じるかについての診断情報を取得するには、ターゲットで find_requirements アスペクトを実行します。

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
これにより、ターゲットにいずれかの Python バージョンが必要な理由に関する情報を示す接尾辞 -pyversioninfo.txt の付いたファイルがビルドされます。バージョンの競合が原因で指定されたターゲットのビルドに失敗した場合でも、機能します。

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 に関する一般的なコメントをご覧ください。 通常、これらは py_library ルールです。
srcs

List of labels; required

ターゲットを作成するために処理されたソース(.py)ファイルのリスト。これには、チェックインしたすべてのコードと生成されたソースファイルが含まれます。ライブラリ ターゲットは deps に属しますが、実行時に必要な他のバイナリ ファイルは data に属します。
imports

List of strings; optional

PYTHONPATH に追加するインポート ディレクトリのリスト。

"Make variable" 置換を実行します。これらのインポート ディレクトリは、このルールとそれに依存するすべてのルールに追加されます(注: このルールが依存するルールではありません。各ディレクトリは、このルールに依存する py_binary ルールによって PYTHONPATH に追加されます。

絶対パス(/ で始まるパス)と、実行ルートより上位のパスを参照するパスは許可されず、エラーが発生します。

legacy_create_init

Integer; optional; default is -1

runfiles ツリーに空の __init__.py ファイルを暗黙的に作成するかどうかを指定します。これらのファイルは、Python ソースコードまたは共有ライブラリが含まれているすべてのディレクトリと、それらのディレクトリのすべての親ディレクトリ(リポジトリのルート ディレクトリを除く)に作成されます。デフォルトの auto は、--incompatible_default_to_explicit_init_py を使用しない限り true を意味します。false の場合、ユーザーは __init__.py ファイル(空の可能性もあります)を作成し、必要に応じて Python ターゲットの srcs に追加する必要があります。
main

Label; optional

アプリケーションのメイン エントリ ポイントであるソースファイルの名前。このファイルは、srcs にもリストされている必要があります。指定しない場合は、代わりに name が使用されます(上記参照)。namesrcs 内のどのファイル名とも一致しない場合は、main を指定する必要があります。
python_version

String; optional; nonconfigurable; default is "_INTERNAL_SENTINEL"

Python 2 または Python 3 用にこのターゲット(およびその推移的な deps)をビルドするかどうか。有効な値は "PY2""PY3"(デフォルト)です。

Python のバージョンは、コマンドラインや、これに依存する他の上位ターゲットで指定されたバージョンに関係なく、この属性で指定されたバージョンに常にリセットされます(デフォルトでこのバージョンが使用されます)。

現在の Python バージョンで select() を行う場合は、@rules_python//python:python_version の値を調べます。詳しくはこちらをご覧ください。

バグ警告: この属性は、Bazel がターゲットをビルドするバージョンを設定しますが、#4815 により、生成されるスタブ スクリプトが実行時に間違ったインタープリタのバージョンを呼び出す可能性があります。こちらの回避策をご覧ください。この方法では、必要に応じていずれかの Python バージョンを指す py_runtime ターゲットを定義し、--python_top を設定してこの py_runtime を有効にします。

srcs_version

String; optional; default is "PY2AND3"

この属性は、ターゲットの srcs が Python 2、Python 3、またはその両方と互換性を持つように宣言します。実際に Python ランタイム バージョンを設定するには、Python 実行ルール(py_binary または py_test)の python_version 属性を使用します。

使用できる値は "PY2AND3""PY2""PY3" です。歴史的な理由から "PY2ONLY""PY3ONLY" という値も使用できますが、基本的には "PY2""PY3" と同じであるため、使用を避ける必要があります。

現在の Python バージョンをこの属性の値に照らして実際に検証するのは、実行可能ルール(py_binarypy_library )だけです。(これは機能です。py_library は現在の Python バージョンを変更しないため、検証を行った場合、同じ呼び出しで PY2ONLY ライブラリと PY3ONLY ライブラリの両方をビルドすることはできません)。さらに、バージョンの不一致がある場合、エラーは実行フェーズでのみ報告されます。特に、bazel build --nobuild の呼び出しでエラーは表示されません。)

どの依存関係にバージョン要件が生じるかについての診断情報を取得するには、ターゲットで find_requirements アスペクトを実行します。

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
これにより、ターゲットにいずれかの Python バージョンが必要な理由に関する情報を示す接尾辞 -pyversioninfo.txt の付いたファイルがビルドされます。バージョンの競合が原因で指定されたターゲットのビルドに失敗した場合でも、機能します。

stamp

Integer; optional; default is 0

詳しくは、py_binary() の引数に関するセクションをご覧ください。ただし、テストでは、stamp 引数がデフォルトで 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 ターゲットは、プラットフォーム ランタイムまたはビルド内ランタイムのいずれかを表します。プラットフォーム ランタイムは、システムがインストールしたインタープリタに既知のパスでアクセスしますが、ビルド内のランタイムはインタープリタとして機能する実行可能ターゲットを参照します。どちらの場合も、「インタープリタ」とは、標準の 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

Name; required

このターゲットの一意の名前。

coverage_tool

Label; optional

py_binary ターゲットと py_test ターゲットからコード カバレッジ情報を収集するために使用します。

設定されている場合、ターゲットは単一のファイルを生成するか、実行可能なターゲットである必要があります。単一のファイル(ターゲットが実行可能である場合は実行可能ファイル)へのパスによって、Python カバレッジ ツールのエントリ ポイントが決まります。カバレッジを有効にすると、ターゲットとその runfile が runfile に追加されます。

ツールのエントリ ポイントは、Python インタープリタ(.py ファイルや .pyc ファイルなど)によって読み込める必要があります。少なくとも run サブコマンドと lcov サブコマンドを含む、coverage.py のコマンドライン引数を受け入れる必要があります。

files

List of labels; optional

ビルド内ランタイムの場合、これはこのランタイムを構成するファイルのセットです。これらのファイルは、このランタイムを使用する Python バイナリのランファイルに追加されます。プラットフォーム ランタイムの場合、この属性は設定しないでください。
interpreter

Label; optional

ビルド内ランタイムの場合、これはインタープリタとして呼び出すターゲットです。プラットフォーム ランタイムの場合、この属性は設定しないでください。
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"

py_binary ターゲットの実行時に使用されるブートストラップ Python スタブ スクリプトの先頭に付加される「Shebang」式。

動機については、問題 8685 をご覧ください。

Windows は対象外です。