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.