Python 規則

回報問題 敬上 查看原始碼 。 。 。 。 。 。 夜間7.37.2 。 。 7.17.06.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 可執行的 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 的匯入目錄清單。

套用至「Make 變數」替代。這些匯入作業 此規則及其依附的所有規則都會新增目錄 (注意: 需優先遵守這項規則系統會將各個目錄加入 PYTHONPATH 需要使用這項規則的 py_binary 規則。

絕對路徑 (開頭為 / 的路徑) 和參照路徑的路徑 系統不允許高於執行根目錄,這樣就會發生錯誤。

legacy_create_init

整數;預設值為 -1

是否在執行檔案樹狀結構中間接建立空白的 __init__.py 檔案。 這些目錄是在包含 Python 原始碼或 Python 原始碼的每個目錄中建立 共用程式庫,以及這些目錄的每個父項目錄 (存放區根目錄除外) 目錄。預設值為 true,除非 使用的是 --incompatible_default_to_explicit_init_py。如果為 False,使用者會 負責建立 (可能為空的) __init__.py 檔案,並將檔案 Python 目標的 srcs (這是必要步驟)。
main

標籤;預設為 None

來源檔案的名稱,是應用程式的主要進入點。 這個檔案也必須列在「srcs」中。如果沒有指定 系統會改用 name (請見上方說明)。如果 name 不是 與 srcs 中的任何檔案名稱相符,則必須指定 main
python_version

String;不可設定;預設為 "_INTERNAL_SENTINEL"

是否要針對 Python 2 或 Python 建構這個目標 (及其轉換 deps) 3.有效值為 "PY2""PY3" (預設值)。

Python 版本一律會重設 (可能根據預設) 為 無論指令列上指定的版本為何, 其他較高的目標。

如果您要在目前的 Python 版本上執行 select(),可以檢查 值 @rules_python//python:python_version。詳情請見 這裡 瞭解詳情

錯誤警告:這項屬性會設定 Bazel 建構目標的版本。 但因為 #4815, 產生的虛設常式指令碼可能仍會在執行階段叫用錯誤的翻譯版本。詳情請見 本 解決方法,其中需要定義指向的py_runtime目標 視需要使用 Python 版本,然後透過設定啟用此 py_runtime --python_top

srcs_version

String;預設值為 "PY2AND3"

這項屬性會宣告目標的 srcs,與任一 Python 相容 2 和/或 Python 3。如要實際設定 Python 執行階段版本,請使用 python_version 屬性 可執行的 Python 規則 (py_binarypy_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

整數;預設值為 -1

是否將建構資訊編碼為二進位檔。可能的值包括:
  • stamp = 1:一律在二進位檔中加上建構資訊加上戳記,即使在 --nostamp 版本。本 建議避免設定,因為這可能會終止 以及任何相依的下游動作
  • stamp = 0:一律以常數值取代建構資訊。這個 也提供良好的建構結果快取功能
  • stamp = -1:建構資訊的嵌入功能是由 --[no]stamp 旗標。

除非其依附元件變更,否則系統「不會」重新建構加上時間戳記的二進位檔。

py_library

查看規則來源
py_library(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

引數

屬性
name

名稱;必選

此目標的專屬名稱。

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 的匯入目錄清單。

套用至「Make 變數」替代。這些匯入作業 此規則及其依附的所有規則都會新增目錄 (注意: 需優先遵守這項規則系統會將各個目錄加入 PYTHONPATH 需要使用這項規則的 py_binary 規則。

絕對路徑 (開頭為 / 的路徑) 和參照路徑的路徑 系統不允許高於執行根目錄,這樣就會發生錯誤。

legacy_create_init

整數;預設值為 -1

是否在執行檔案樹狀結構中間接建立空白的 __init__.py 檔案。 這些目錄是在包含 Python 原始碼或 Python 原始碼的每個目錄中建立 共用程式庫,以及這些目錄的每個父項目錄 (存放區根目錄除外) 目錄。預設值為 true,除非 使用的是 --incompatible_default_to_explicit_init_py。如果為 False,使用者會 負責建立 (可能為空的) __init__.py 檔案,並將檔案 Python 目標的 srcs (這是必要步驟)。
main

標籤;預設為 None

來源檔案的名稱,是應用程式的主要進入點。 這個檔案也必須列在「srcs」中。如果沒有指定 系統會改用 name (請見上方說明)。如果 name 不是 與 srcs 中的任何檔案名稱相符,則必須指定 main
python_version

String;不可設定;預設為 "_INTERNAL_SENTINEL"

是否要針對 Python 2 或 Python 建構這個目標 (及其轉換 deps) 3.有效值為 "PY2""PY3" (預設值)。

Python 版本一律會重設 (可能根據預設) 為 無論指令列上指定的版本為何, 其他較高的目標。

如果您要在目前的 Python 版本上執行 select(),可以檢查 值 @rules_python//python:python_version。詳情請見 這裡 瞭解詳情

錯誤警告:這項屬性會設定 Bazel 建構目標的版本。 但因為 #4815, 產生的虛設常式指令碼可能仍會在執行階段叫用錯誤的翻譯版本。詳情請見 本 解決方法,其中需要定義指向的py_runtime目標 視需要使用 Python 版本,然後透過設定啟用此 py_runtime --python_top

srcs_version

String;預設值為 "PY2AND3"

這項屬性會宣告目標的 srcs,與任一 Python 相容 2 和/或 Python 3。如要實際設定 Python 執行階段版本,請使用 python_version 屬性 可執行的 Python 規則 (py_binarypy_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

整數;預設值為 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 目標可代表平台執行階段in-build 執行階段中。平台執行階段存取系統安裝的解譯器。 路徑,而建構中的執行階段會指向做為解譯器的可執行目標。於 兩種情況皆稱為「解譯器」意即任何可執行 依照與標準指令碼相同的慣例,執行透過指令列傳遞的 Python 指令碼 CPython 解譯器。

平台執行階段的本質是非密封的。必須對目標平台施加要求 才能訓練特定路徑就建構中的執行階段不一定重要 具體取決於它指向已簽入的解譯器,或是存取 系統解譯器

範例:

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 涵蓋率工具的進入點。目標及其 啟用涵蓋率功能之後,系統就會將 runfile 加入至執行檔案。

工具的進入點必須可透過 Python 解譯器載入 (例如 .py.pyc 檔案)。必須接受指令列引數 至少包含 coverage.py runlcov 子指令。

files

標籤清單;預設為 []

對於建構執行階段而言,這是構成這個執行階段的檔案組合。這些檔案會 ,新增至使用這個執行階段的 Python 二進位檔執行檔案。平台執行階段 不得設定此屬性。
interpreter

標籤;預設為 None

針對建構執行階段,這是要當做解譯器叫用的目標。平台適用 因此無法設定此屬性的執行階段。
interpreter_path

String;預設值為 ""

針對平台執行階段,這是目標上 Python 解譯器的絕對路徑 平台。如果是內建執行階段,則不得設定這個屬性。
python_version

String;預設值為 "_INTERNAL_SENTINEL"

這個執行階段是用於 Python 主要版本 2 還是 3。有效值為 "PY2""PY3"

預設值是由 --incompatible_py3_is_default 旗標控管。 不過,日後這項屬性將為必填,且沒有預設值。

stub_shebang

String;預設值為 "#!/usr/bin/env python3"

「Shebang」運算式前方加在 Bootstrapping Python 指令碼 在執行 py_binary 目標時使用。

請參閱問題 8685, 動力。

不適用於 Windows。