PEP 496 – 환경 마커
- Author:
- James Polley <jp at jamezpolley.com>
- BDFL-Delegate:
- Alyssa Coghlan <ncoghlan at gmail.com>
- Status:
- Rejected
- Type:
- Informational
- Topic:
- Packaging
- Created:
- 03-Jul-2015
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
PEP 상태
이 PEP의 초안이 처음 작성된 후, 환경 마커를 포함한 의존성 선언 문법을 완전히 명세하기 위해 PEP 508이 개발되어 제출되었습니다. 그 결과, 이 PEP는 더 포괄적인 PEP 508에 밀려 거부되었습니다.
초록
환경 마커는 현재 실행 환경에 관한 조건을 기술합니다. 환경 마커는 특정 의존성이 특정 환경에서만 필요한 경우를 나타내거나, Python 런타임의 존재 이상의 추가 제약 조건이 있는 배포에 대해 지원되는 플랫폼을 나타내는 데 사용됩니다.
환경 마커는 PEP 345에서 처음 명세되었습니다. PEP 426은 (PEP 345를 대체할 예정이었던 PEP로) 마커에 대한 확장을 제안했습니다. 2.7.10이 출시되었을 때, 이 확장조차도 단순한 어휘 비교에 의존한다는 점 때문에 불충분해졌고, 그리하여 이 PEP가 탄생하게 되었습니다.
근거
많은 Python 패키지는 이식성을 염두에 두고 작성됩니다.
많은 패키지에서 이는 폭넓은 범위의 Python 릴리스를 지원하는 것을 목표로 한다는 의미입니다. 이러한 패키지가 argparse와 같이 처음에는 외부 라이브러리로 시작했으나 나중에 코어에 통합된 라이브러리에 의존한다면, 사용 중인 Python 버전에 따라 필요한 패키지 집합이 달라지므로 단일한 요구 사항 집합을 지정하기가 어렵습니다.
다른 패키지에게 이식성을 고려한 설계란 여러 운영 체제를 지원하는 것을 의미합니다. 그러나 운영 체제 간의 상당한 차이로 인해 특정 의존성이 특정 플랫폼에서만 필요할 수 있습니다(예를 들어, Windows에서만 pywin32에 의존하는 경우)”
환경 마커는 개발자가 특정 환경에 한정된 요구 사항을 나열할 수 있게 함으로써 요구 사항 목록에 더 많은 유연성을 제공하고자 합니다.
예시
다음은 requirements.txt 안에서 이러한 마커를 사용하는 몇 가지 예입니다:
pywin32 >=1.0 ; sys_platform == 'win32'
unittest2 >=2.0,<3.0 ; python_version == '2.4' or python_version == '2.5'
backports.ssl_match_hostname >= 3.4 ; python_version < '2.7.9' or (python_version >= '3.0' and python_version < '3.4')
그리고 다음은 Windows를 사용할 때 런타임과 빌드 타임 모두에 PyWin32가 필요한 배포 패키지의 setup.py에 포함된 조건부 메타데이터의 예입니다:
setup(
install_requires=["pywin32 > 1.0 : sys.platform == 'win32'"],
setup_requires=["pywin32 > 1.0 : sys.platform == 'win32'"]
)
마이크로 언어
이를 뒷받침하는 마이크로 언어는 다음과 같습니다. 이 언어는 다음을 비교합니다:
==및in연산자(와 그 반대 연산자)를 사용하는 문자열- 문자열에 지원되는 연산자에 더해
<,<=,>=,<연산자를 사용하는 버전 번호
일반적인 불리언 연산자 and와 or를 사용하여 표현식을 결합할 수 있으며, 그룹화를 위한 괄호도 지원됩니다.
의사 문법은 다음과 같습니다
MARKER: EXPR [(and|or) EXPR]*
EXPR: ("(" MARKER ")") | (STREXPR|VEREXPR)
STREXPR: STRING [STRCMPOP STREXPR]
STRCMPOP: ==|!=|in|not in
VEREXPR: VERSION [VERCMPOP VEREXPR]
VERCMPOP: (==|!=|<|>|<=|>=)
SUBEXPR는 Python 문자열(예: 'win32')이거나 아래에 나열된 Strings 마커 변수 중 하나입니다.
VEREXPR는 PEP 440 버전 식별자이거나 아래에 나열된 Version number 마커 변수 중 하나입니다. 버전 번호 간의 비교는 PEP 440 의미 체계를 사용하여 수행됩니다.
문자열
os_name:os.namesys_platform:sys.platformplatform_release:platform.release()implementation_name:sys.implementation.nameplatform_machine:platform.machine()platform_python_implementation:platform.python_implementation()
특정 문자열 값을 사용할 수 없는 경우(예: Python 3.3 이전 버전의 sys.implementation.name), 해당 마커 변수는 반드시 빈 문자열과 동등한 것으로 간주해야 합니다.
특정 버전 번호 값을 사용할 수 없는 경우(예: Python 3.3 이전 버전의 sys.implementation.version), 해당 마커 변수는 반드시 0과 동등한 것으로 간주해야 합니다.
버전 번호
python_version:platform.python_version()[:3]python_full_version: 아래 정의를 참조하십시오.platform_version:platform.version()implementation_version: 아래 정의를 참조하십시오.
python_full_version과 implementation_version 마커 변수는 다음 알고리즘에 따라 각각 sys.version_info와 sys.implementation.version에서 도출됩니다.:
def format_full_version(info):
version = '{0.major}.{0.minor}.{0.micro}'.format(info)
kind = info.releaselevel
if kind != 'final':
version += kind[0] + str(info.serial)
return version
python_full_version = format_full_version(sys.version_info)
implementation_version = format_full_version(sys.implementation.version)
python_full_version은 일반적으로 sys.version.split()[0]에 해당합니다.
Copyright
This document has been placed in the public domain.