Python ルール

問題を報告 ソースを表示 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

ルール

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

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

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

引数

属性
name

名前: 必須

このターゲットの名前。


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

ラベルのリスト。デフォルトは [] です。

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

ラベルのリスト(必須)

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

文字列のリスト。デフォルトは [] です。

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

「変数にする」の置換が適用されます。これらのインポート ディレクトリは、このルールと、このルールに依存するすべてのルールに追加されます(注: このルールが依存するルールではありません)。このルールに依存する py_binary ルールによって、各ディレクトリが PYTHONPATH に追加されます。

絶対パス(/ で始まるパス)と、実行ルートの上にあるパスを参照するパスは使用できません。使用するとエラーが発生します。

legacy_create_init

整数。デフォルトは -1 です。

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

ラベル(デフォルトは None

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

文字列。構成不可。デフォルトは "_INTERNAL_SENTINEL" です。

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

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

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

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

srcs_version

文字列。デフォルトは "PY2AND3" です。

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

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

実行可能なルール(py_binarypy_library )のみが、この属性の値と現在の Python バージョンを実際に照合します。(これは機能であり、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

整数。デフォルトは -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

名前(必須)

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

deps

ラベルのリスト。デフォルトは [] です。

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

ラベルのリスト。デフォルトは [] です。

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

文字列のリスト。デフォルトは [] です。

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

「変数を作成」による置換が適用されます。これらのインポート ディレクトリは、このルールとそれに依存するすべてのルールに追加されます(注: このルールが依存するルールではありません。このルールに依存する py_binary ルールによって、各ディレクトリが PYTHONPATH に追加されます。

絶対パス(/ で始まるパス)と、実行ルートの上にあるパスを参照するパスは使用できません。使用するとエラーが発生します。

srcs_version

文字列。デフォルトは "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

名前(必須)

このターゲットの名前。

deps

ラベルのリスト。デフォルトは [] です。

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

ラベルのリスト。必須

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

文字列のリスト。デフォルトは [] です。

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

「変数にする」の置換が適用されます。これらのインポート ディレクトリは、このルールとそれに依存するすべてのルールに追加されます(注: このルールが依存するルールではありません。各ディレクトリは、このルールに依存する py_binary ルールによって PYTHONPATH に追加されます。

絶対パス(/ で始まるパス)と、実行ルートの上にあるパスを参照するパスは使用できません。使用するとエラーが発生します。

legacy_create_init

整数。デフォルトは -1 です。

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

ラベル(デフォルトは None

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

文字列、設定不可、デフォルトは "_INTERNAL_SENTINEL"

このターゲット(およびその伝播 deps)を Python 2 用と Python 3 用のどちらでビルドするか。有効な値は "PY2""PY3"(デフォルト)です。

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

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

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

srcs_version

文字列。デフォルトは "PY2AND3" です。

この属性は、ターゲットの srcs が Python 2、Python 3、またはその両方に対応していることを宣言します。Python ランタイム バージョンを実際に設定するには、実行可能な Python ルール(py_binary または py_test)の python_version 属性を使用します。

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

実行可能なルール(py_binarypy_library )のみが、この属性の値と現在の Python バージョンを実際に照合します。(これは機能です。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

整数。デフォルトは 0 です。

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

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

名前: 必須

このターゲットの名前。

bootstrap_template

ラベル: デフォルトは "@bazel_tools//tools/python:python_bootstrap_template.txt"

これは、以前は「Python スタブ スクリプト」と呼ばれ、すべての Python 実行可能ターゲットのエントリポイントです。
coverage_tool

ラベル(デフォルトは None

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

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

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

files

ラベルのリスト。デフォルトは [] です。

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

ラベル(デフォルトは None

ビルドイン ランタイムの場合、これはインタープリタとして呼び出すターゲットです。プラットフォーム ランタイムの場合は、この属性を設定しないでください。
interpreter_path

文字列。デフォルトは ""

プラットフォーム ランタイムの場合、これはターゲット プラットフォーム上の Python インタープリタの絶対パスです。ビルドイン ランタイムの場合は、この属性を設定しないでください。
python_version

文字列。デフォルトは "_INTERNAL_SENTINEL" です。

このランタイムが Python メジャー バージョン 2 または 3 かどうか。有効な値は "PY2""PY3" です。

デフォルト値は --incompatible_py3_is_default フラグで制御されます。ただし、今後この属性は必須となり、デフォルト値は設定されなくなります。

stub_shebang

文字列。デフォルトは "#!/usr/bin/env python3" です。

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

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

Windows には適用されません。