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 を実行する場合(java_test からモックリソースを設定するなど)、適切な方法では他のバイナリまたはテストをそのデータ セクションの py_binary に依存させます。すると、もう一方のバイナリで、ソース ディレクトリを基準とする py_binary の場所を特定できます。

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

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 に追加するインポート ディレクトリのリスト。

"Makevariable" 置換の対象となります。これらのインポート ディレクトリは、このルールとそれに依存するすべてのルールに追加されます(注: このルールが依存するルールではありません)。各ディレクトリは、このルールに依存する 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 ルールの python_version 属性(py_binary または py_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

ビルド情報をバイナリにエンコードするかどうか。考えられる値は次のとおりです。
  • 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 に追加するインポート ディレクトリのリスト。

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

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

srcs_version

String; optional; default is "PY2AND3"

この属性は、ターゲットの srcs が Python 2、Python 3、またはその両方と互換性があることを宣言します。実際に Python ランタイム バージョンを設定するには、実行可能な Python ルールの python_version 属性(py_binary または py_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 に関する一般的なコメントをご覧ください。通常は py_library ルールです。
srcs

List of labels; required

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

List of strings; optional

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

"Makevariable" 置換の対象となります。これらのインポート ディレクトリは、このルールとそれに依存するすべてのルールに追加されます(注: このルールが依存するルールではありません)。各ディレクトリは、このルールに依存する 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 ルールの python_version 属性(py_binary または py_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

テストでは、スタンプ引数がデフォルトで 0 に設定される点を除き、py_binary() 引数のセクションをご覧ください。

py_runtime

ルールのソースを表示
py_runtime(name, bootstrap_template, 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

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

bootstrap_template

Label; optional; default is @bazel_tools//tools/python:python_bootstrap_template.txt

旧称「Python スタブ スクリプト」は、すべての Python 実行可能ファイルのエントリ ポイントです。
coverage_tool

Label; optional

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

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

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

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 には適用されません。