Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 390 – Distutils를 위한 정적 메타데이터

Author:
Tarek Ziadé <tarek at ziade.org>
BDFL-Delegate:
Alyssa Coghlan
Discussions-To:
Distutils-SIG list
Status:
Rejected
Type:
Standards Track
Topic:
Packaging
Created:
10-Oct-2009
Python-Version:
2.7, 3.2
Post-History:

Resolution:
Distutils-SIG message

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

이 PEP는 setup.cfg 파일의 새 섹션과 새 형식을 설명합니다. 이를 사용하면 setup.py를 사용하지 않고도 패키지의 메타데이터를 기술할 수 있습니다.

거부 공지

distutils2가 더 이상 표준 라이브러리에 포함되지 않게 되었으므로, 이 PEP는 2013년 4월 말에 Alyssa Coghlan에 의해 거부되었습니다.

PEP 426 (메타데이터 2.0)에 기반한 대체 PEP가 작성될 예정입니다. 이 PEP는 소스 tarball이나 VCS 체크아웃이 주어졌을 때 sdist 아카이브를 생성하는 데 필요한 최소한의 정보를 정의합니다.

근거

현재는 설치되지 않은 배포판의 모든 메타데이터(PEP 314 참고)를 나열하려면 setup.py 명령줄 인터페이스를 사용해야 합니다.

즉, 기본적으로 배포판을 내려받은 뒤 다음을 실행합니다:

$ python setup.py --name
Distribute

$ python setup.py --version
0.6.4

여기서 name과 version은 메타데이터 필드입니다. 이 방식은 잘 동작하지만, 개발자가 setup.py에 코드를 더 추가하는 순간 이 기능이 망가질 수 있고, 최악의 경우 대상 시스템에서 원치 않는 일을 수행할 수도 있습니다.

게다가 OS 패키저가 자신이 다시 패키징하는 배포판의 메타데이터를 얻으려 할 때, 작업 중인 setup.py 파일을 이해하는 데 어려움을 겪을 수 있습니다.

따라서 이 PEP의 근거는 setup.py와 함께 두는 정적 설정 파일에 메타데이터를 선언하는 방법을 제공하는 것입니다. 이 설정 파일은 어떤 서드파티 코드도 실행하지 않아도 됩니다.

setup.cfg에 metadata 섹션 추가하기

가장 먼저 도입하려는 것은 setup.cfg 파일 안의 [metadata] 섹션으로, 이 섹션에는 메타데이터의 어떤 필드든 포함될 수 있습니다:

[metadata]
name = Distribute
version = 0.6.4

setup.cfg 파일을 사용하는 것은 Distutils에서 다뤄야 할 설정 파일을 또 하나 추가하는 일을 피하기 위해서입니다.

이 파일은 명령이 실행될 때 이미 Distutils가 읽고 있으며, metadata 섹션이 발견되면 이를 사용해 메타데이터 필드를 채웁니다. 메타데이터 필드에 해당하는 옵션이 setup()에 주어지면, 그 값이 setup.cfg에 있었을 수 있는 값을 덮어씁니다.

setup.py는 여전히 사용되며, 메타데이터 필드에 속하지 않는 일부 옵션을 정의하는 데 필요할 수 있다는 점에 유의하십시오. 예를 들어 sdist 명령은 packages나 scripts 같은 옵션을 사용할 수 있습니다.

여러 줄 값

일부 메타데이터 필드는 여러 값을 가질 수 있습니다. setup.cfg를 ConfigParser 및 RFC 822의 LONG HEADER FIELDS (3.1.1절 참고)와 호환되도록 유지하기 위해, 이러한 값은 ,로 구분된 값으로 표현합니다:

requires = pywin32, bar > 1.0, foo

이 변수를 읽으면 값이 파싱되어 리스트로 변환됩니다: ['pywin32', 'bar > 1.0', 'foo'].

컨텍스트 의존 섹션

metadata 섹션에서는 컨텍스트 의존 섹션도 사용할 수 있습니다.

컨텍스트 의존 섹션은 실행 환경에 관한 조건이 붙은 섹션입니다. 다음은 몇 가지 예입니다:

[metadata]
name = Distribute
version = 0.6.4

[metadata:sys_platform == 'win32']
requires = pywin32, bar > 1.0
obsoletes = pywin31

[metadata:os_machine == 'i386']
requires = foo

[metadata:python_version == '2.4' or python_version == '2.5']
requires = bar

[metadata:'linux' in sys_platform]
requires = baz

모든 [metadata:condition] 섹션은 파일을 읽을 때 조건이 충족되는 경우에만 사용됩니다. 이러한 컨텍스트 의존 섹션을 도입한 배경 동기는 배포판이 설치될 수 있는 플랫폼에 따라 달라지는 요구 사항을 정의할 수 있도록 하려는 것입니다. (PEP 314 참고).

이를 뒷받침하는 마이크로 언어는 가능한 한 가장 단순합니다: 문자열만을 ==와 in 연산자(및 그 반대 연산자)로 비교하며, 표현식을 결합할 수 있습니다. 또한 이 덕분에 파이썬 사용자가 아닌 사람도 쉽게 이해할 수 있습니다.

의사 문법은 다음과 같습니다

EXPR [in|==|!=|not in] EXPR [or|and] ...

여기서 EXPR은 다음 중 하나에 해당합니다:

  • python_version = ‘%s.%s’ % (sys.version_info[0], sys.version_info[1])
  • os_name = os.name
  • sys_platform = sys.platform
  • platform_version = platform.version()
  • platform_machine = platform.machine()
  • 2.4나 win32와 같은 자유 문자열

in은 문자열에만 사용할 수 있다는 점에 유의하십시오. 즉, 오른쪽에 튜플이나 리스트 같은 다른 시퀀스를 사용할 수 없습니다.

Distutils는 setup.cfg 파일이 주어지면 실행 환경에 맞는 배포판의 메타데이터를 생성하는 함수를 제공할 것입니다:

>>> from distutils.util import local_metadata
>>> local_metadata('setup.cfg')
<DistributionMetadata instance>

즉, 기본 Python만으로도 서드파티 코드를 전혀 실행하지 않고 패키지의 메타데이터를 읽을 수 있습니다.

이 기능은 metadata 네임스페이스에만 국한되지 않는다는 점에 유의하십시오. 따라서 다른 어떤 섹션이든 이와 같은 컨텍스트 의존 섹션으로 확장할 수 있습니다.

PKG-INFO 생성과 PEP 314에 미치는 영향

Distutils가 PKG-INFO를 생성할 때, 조건에 의존하는 모든 필드에는 줄 끝의 ; 구분자 뒤에 해당 조건이 기록됩니다:

Metadata-Version: 1.2
Name: distribute
Version: 0.6.4
...
Requires: pywin32, bar > 1.0; sys_platform == 'win32'
Requires: foo; os_machine == 'i386'
Requires: bar; python_version == '2.4' or python_version == '2.5'
Requires: baz; 'linux' in sys_platform
Obsoletes = pywin31; sys_platform == 'win32'
...
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Python Software Foundation License

이 파일은 DistributionMetadata 클래스로 열 수 있다는 점에 유의하십시오. 이 클래스는 실행 환경을 바탕으로 이 마이크로 언어를 사용할 수 있습니다.

Python 2.5 i386 Linux에서 실행해 봅시다:

>>> from distutils.dist import DistributionMetadata
>>> metadata = DistributionMetadata('PKG_INFO')
>>> metadata.get_requires()
['foo', 'bar', 'baz']

다른 환경의 메타데이터를 얻고자 하는 경우에는 실행 환경을 재정의할 수 있습니다:

>>> env = {'python_version': '2.4',
...        'os_name': 'nt',
...        'sys_platform': 'win32',
...        'platform_version': 'MVCC++ 6.0'
...        'platform_machine': 'i386'}
...
>>> metadata = DistributionMetadata('PKG_INFO', environment=env)
>>> metadata.get_requires()
['bar > 1.0', 'foo', 'bar']

이에 맞추어 PEP 314도 변경되며, 따라서 각 필드에 이 추가 조건 마커를 붙일 수 있습니다.

호환성

이 변경은 새로운 메타데이터 1.2 형식에 기반하므로, Distutils는 이전 PKG-INFO 파일과 새 PKG-INFO 파일을 구별할 수 있습니다.

setup.cfg 파일의 변경 사항은 ConfigParser와의 호환성을 유지하며, 기존 setup.cfg 파일을 깨뜨리지 않습니다.

제약 사항

현재는 < 및 > 연산자를 제공하지 않으며, python_version은 일반 문자열입니다. 따라서 섹션을 몇몇 Python 버전으로 제한해야 할 때는 or 연산자를 사용해야 합니다. 다만 PEP 386이 채택된다면, python_version을 내부적으로 문자열과 비교 가능한 형태로 바꾸고 < 및 > 연산자를 도입할 수도 있습니다.

마지막으로, 배포판이 setup.cfg에서 모든 메타데이터 필드를 설정하지 못하더라도 괜찮습니다. 이 경우 local_metadata가 호출될 때 해당 필드는 UNKNOWN으로 설정됩니다. UNKNOWN 값을 얻었다면, 전체 메타데이터를 얻기 위해 setup.py 명령줄 인터페이스를 실행해야 할 수도 있다는 뜻입니다.

감사의 글

Distutils-SIG.