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는 실행 가능한 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 변수' 대체 적용 이 규칙 및 이 규칙에 종속되는 모든 규칙에 가져오기 디렉터리가 추가됩니다 (참고: 이 규칙이 적용되는 규칙은 아님). 각 디렉터리가 이 규칙에 종속된 py_binary 규칙에 의해 PYTHONPATH에 추가됩니다.

절대 경로 (/로 시작하는 경로) 및 실행 루트 위의 경로를 참조하는 경로는 허용되지 않으며 이로 인해 오류가 발생합니다.

legacy_create_init

정수, 기본값은 -1입니다.

실행 파일 트리에 빈 __init__.py 파일을 암시적으로 생성할지 여부입니다. Python 소스 코드 또는 공유 라이브러리가 포함된 모든 디렉터리와 저장소 루트 디렉터리를 제외한 이러한 디렉터리의 모든 상위 디렉터리에 생성됩니다. 기본값인 자동은 --incompatible_default_to_explicit_init_py를 사용하지 않는 한 true를 의미합니다. false인 경우 사용자는 __init__.py 파일을 만들고 필요에 따라 Python 대상의 srcs에 추가해야 합니다.
main

라벨. 기본값은 None입니다.

애플리케이션의 기본 진입점인 소스 파일의 이름입니다. 이 파일은 srcs에도 나열되어야 합니다. 지정하지 않으면 name가 대신 사용됩니다 (위 참조). namesrcs에 있는 어떤 파일 이름과도 일치하지 않으면 main를 지정해야 합니다.
python_version

문자열, 구성 불가, 기본값은 "_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

문자열. 기본값은 "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
          
)을 실행하면 됩니다. 이렇게 하면 타겟에 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에 추가할 가져오기 디렉터리의 목록입니다.

'Make 변수' 대체 적용 이 규칙 및 이 규칙에 종속되는 모든 규칙에 가져오기 디렉터리가 추가됩니다 (참고: 이 규칙이 적용되는 규칙은 아님). 각 디렉터리가 이 규칙에 종속된 py_binary 규칙에 의해 PYTHONPATH에 추가됩니다.

절대 경로 (/로 시작하는 경로) 및 실행 루트 위의 경로를 참조하는 경로는 허용되지 않으며 이로 인해 오류가 발생합니다.

srcs_version

문자열. 기본값은 "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
          
)을 실행하면 됩니다. 이렇게 하면 타겟에 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에 추가할 가져오기 디렉터리의 목록입니다.

'Make 변수' 대체 적용 이 규칙 및 이 규칙에 종속되는 모든 규칙에 가져오기 디렉터리가 추가됩니다 (참고: 이 규칙이 적용되는 규칙은 아님). 각 디렉터리가 이 규칙에 종속된 py_binary 규칙에 의해 PYTHONPATH에 추가됩니다.

절대 경로 (/로 시작하는 경로) 및 실행 루트 위의 경로를 참조하는 경로는 허용되지 않으며 이로 인해 오류가 발생합니다.

legacy_create_init

정수, 기본값은 -1입니다.

실행 파일 트리에 빈 __init__.py 파일을 암시적으로 생성할지 여부입니다. Python 소스 코드 또는 공유 라이브러리가 포함된 모든 디렉터리와 저장소 루트 디렉터리를 제외한 이러한 디렉터리의 모든 상위 디렉터리에 생성됩니다. 기본값인 자동은 --incompatible_default_to_explicit_init_py를 사용하지 않는 한 true를 의미합니다. false인 경우 사용자는 __init__.py 파일을 만들고 필요에 따라 Python 대상의 srcs에 추가해야 합니다.
main

라벨. 기본값은 None입니다.

애플리케이션의 기본 진입점인 소스 파일의 이름입니다. 이 파일은 srcs에도 나열되어야 합니다. 지정하지 않으면 name가 대신 사용됩니다 (위 참조). namesrcs에 있는 어떤 파일 이름과도 일치하지 않으면 main를 지정해야 합니다.
python_version

문자열, 구성 불가, 기본값은 "_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

문자열. 기본값은 "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
          
)을 실행하면 됩니다. 이렇게 하면 타겟에 Python 버전 또는 다른 버전이 필요한 이유에 대한 정보를 제공하는 -pyversioninfo.txt 서픽스가 있는 파일이 빌드됩니다. 버전 충돌로 인해 지정된 타겟을 빌드하지 못한 경우에도 작동합니다.

stamp

정수, 기본값은 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

이름. 필수 항목입니다.

이 대상의 고유한 이름입니다.

bootstrap_template

라벨. 기본값은 "@bazel_tools//tools/python:python_bootstrap_template.txt"입니다.

이전에 'Python 스텁 스크립트'라고 부르는 이 스크립트는 모든 Python 실행 대상의 진입점입니다.
coverage_tool

라벨. 기본값은 None입니다.

py_binarypy_test 타겟에서 코드 적용 범위 정보를 수집하는 데 사용하는 타겟입니다.

설정된 경우 타겟은 단일 파일을 생성하거나 실행 가능한 타겟이어야 합니다. 단일 파일 경로 또는 타겟이 실행 파일인 경우에는 실행 파일에 따라 Python 적용 범위 도구의 진입점이 결정됩니다. 적용 범위가 사용 설정되면 타겟과 대상의 실행 파일이 실행 파일에 추가됩니다.

도구의 진입점은 Python 인터프리터 (예: .py 또는 .pyc 파일)로 로드할 수 있어야 합니다. 적어도 runlcov 하위 명령어를 포함하여 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에는 적용되지 않습니다.