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

Python 개선 제안 한국어 번역

PEP 632 – distutils 모듈 사용 중단

Author:
Steve Dower <steve.dower at python.org>
Discussions-To:
Discourse thread
Status:
Final
Type:
Standards Track
Created:
03-Sep-2020
Python-Version:
3.10
Post-History:
03-Sep-2020, 22-Jan-2021
Resolution:
Python-Dev thread

Table of Contents

번역·라이선스 안내

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

초록

distutils 모듈 [1]은 오랫동안 대신 setuptools 패키지 [2]를 사용할 것을 권장해 왔습니다. Setuptools는 최근 distutils의 완전한 사본을 통합했으며 더 이상 표준 라이브러리 [3]에 의존하지 않습니다. Pip은 이미 오랫동안 패키지를 설치할 때 distutils를 setuptools로 묵묵히 대체해 왔으며, distutils 문서에서는 2014년(또는 그 이전)부터 해당 모듈이 단계적으로 폐기되고 있다고 밝혀 왔습니다. 이제 표준 라이브러리에서 이를 제거할 때가 되었습니다.

동기

distutils [1]는 네이티브 확장 모듈의 컴파일을 포함하여 Python 패키지를 패키징하고 배포하기 위한, 대부분 문서화되지 않았고 유지 관리되지 않는 유틸리티 모음입니다. 이는 Python 배포판을 설명하는 구성 형식을 정의하며, 소스 코드 디렉터리를 소스 배포판과 일부 형태의 바이너리 배포판으로 변환하는 도구를 제공합니다. 표준 라이브러리에 포함되어 있기 때문에 많은 업데이트는 주요 릴리스와 함께만 출시될 수 있으며, 사용자는 특정 수정 사항을 이용할 수 있다고 확신할 수 없습니다.

setuptools [2]는 distutils를 기반으로 한, 더 잘 문서화되고 유지 관리가 잘 되는 개선판입니다. 매우 유사한 기능을 제공하지만, 이전 Python 릴리스의 사용자를 훨씬 더 잘 지원할 수 있으며 버그 보고에도 더 빠르게 대응할 수 있습니다. setuptools에는 이미 여러 플랫폼별 개선 사항이 존재하지만 distutils에는 추가되지 않았으며, distutils 문서에서는 setuptools를 우선 사용하라는 권고가 오랫동안 이어져 왔습니다.

역사적으로 setuptools는 서브클래싱과 몽키 패칭을 사용하여 distutils를 확장해 왔지만, 이제는 기반 코드의 사본을 가져왔습니다. [3] 그 결과 distutils에 대한 두 번째로 마지막 주요 의존성이 사라졌으며, 표준 라이브러리에 이를 유지할 필요가 없어졌습니다.

distutils에 대한 마지막 의존성은 CPython 자체이며, CPython은 표준 라이브러리의 네이티브 확장 모듈을 빌드하는 데 이를 사용합니다(Windows 제외). 이는 CPython 빌드 시 의존성이므로, 표준 라이브러리의 일부가 아니더라도 이 특정한 경우에는 distutils를 계속 사용할 수 있습니다.

사용 중단과 제거를 통해 문제를 setuptools 프로젝트에서 수정해야 한다는 점이 명확해지고, 버그 보고의 원천과 불필요한 테스트 유지 관리가 줄어들 것입니다. 또한 PEP 517 덕분에 이제 더 쉽게 지원할 수 있는 대체 빌드 백엔드의 개발을 촉진하는 데에도 도움이 될 것입니다.

사양

Python 3.10 및 3.11에서는 distutils를 공식적으로 사용 중단으로 표시합니다. 이 시점에 알려진 모든 문제를 종료합니다. import distutils는 사용 중단 경고를 발생시킵니다. 릴리스를 차단하는 것으로 간주될 수 있는 새로운 문제는 여전히 수정할 수 있지만, 새로운 도구나 플랫폼에 대한 지원은 추가하지 않습니다.

Python 3.10 및 3.11 기간에는 표준 라이브러리 내부에서 distutils를 사용하는 부분이 대체 API를 사용하도록 변경될 수 있습니다.

Python 3.12에서는 make install 또는 자사 배포판을 통해 distutils가 더 이상 설치되지 않습니다. 서드파티 재배포자는 더 이상 번들이나 저장소에 distutils를 포함해서는 안 됩니다.

이 PEP에서는 현재 distutils를 사용하는 CPython 빌드 프로세스의 부분을 마이그레이션하는 것에 관해 어떠한 사양도 제시하지 않습니다. 기여 상황에 따라 이 마이그레이션은 언제든지 이루어질 수 있습니다.

Python 3.12가 시작되고 CPython 빌드 프로세스가 더 이상 표준 라이브러리에 distutils가 포함되는 것에 의존하지 않게 되면, 전체 Lib/distutils 디렉터리와 Lib/test/test_distutils.py 파일을 저장소에서 제거합니다.

distutils에 대한 다른 참조도 정리합니다. Python 3.9 최초 릴리스 기준으로 다음 모듈의 코드 또는 주석에 참조가 있습니다.

  • Lib/ctypes/util.py
  • Lib/site.py
  • Lib/sysconfig.py
  • Lib/_aix_support.py
  • Lib/_bootsubprocess.py
  • Lib/_osx_support.py
  • Modules/_decimal/tests/formathelper.py

다음 CPython의 Tools도 distutils를 참조합니다. 이 중 어느 것도 CPython과 함께 설치되지 않습니다.

  • PC/layout (참조가 제거될 예정입니다)
  • Tools/msi (참조가 제거될 예정입니다)
  • Tools/peg_generator (다른 빌드 도구에 맞게 조정될 예정입니다)
  • Tools/test2to3 (예제 프로젝트가 제거될 예정입니다)

distutils 코드가 이미 setuptools에 포함되어 있으므로, 이를 다른 형태로 다시 배포할 필요가 없습니다. 해당 기능에 접근해야 하는 사용자는 setuptools 또는 대체 빌드 백엔드를 사용해야 합니다.

하위 호환성

distutils를 가져오는 코드는 Python 3.12부터 더 이상 작동하지 않습니다.

권장되는 마이그레이션 경로는 setuptools에서 동등하지만 동일하지는 않은 가져오기를 사용하거나([5] 참조), 대체 빌드 백엔드로 마이그레이션하는 것입니다(PEP 517 참조).

distutils를 사용하는 setup.py 파일을 해당 대응 항목으로 투명하게 전환하는 코드가 이미 setuptools에 존재하므로, 대부분의 작동하는 빌드 스크립트는 이미 setuptools에서 작동하는 것으로 알려져 있습니다. 이러한 스크립트는 가져오기 문을 업데이트해야 할 수 있습니다. 구체적인 마이그레이션 지침은 setuptools 문서를 참조하십시오. [5]

일부 프로젝트는 distutils에 적용되는 대체 패치 세트를 사용하며, 특히 numpy.distutils가 그러합니다. [6] 이를 수행하는 것으로 알려진 프로젝트에는 통지했습니다.

많은 빌드 스크립트는 사용자 지정 명령이나 범위가 좁은 패치를 사용합니다. 이러한 패키지는 이미 setuptools가 distutils를 재정의하는 대상이므로, distutils 제거로 인한 중단은 최소화될 것으로 예상합니다. 스크립트에서 distutils를 가져오지 않도록 계속 업데이트해야 할 수도 있습니다.

참조 구현

setuptools 버전 48에는 distutils의 완전한 복사본이 포함되어 있으므로 더 이상 표준 라이브러리의 복사본에 의존하지 않습니다. 이들이 겪은 구현상의 문제 대부분은 표준 라이브러리에 distutils가 계속 존재하기 때문에 발생했으므로, 이를 제거하면 구현의 안정성이 향상됩니다.

표준 라이브러리에서 distutils를 제거하기 위한 참조 구현은 아직 없으며, 표준 라이브러리에 포함된 distutils 복사본에 의존하지 않는 CPython 네이티브 모듈 빌드를 위한 구현도 없습니다.

마이그레이션 지침

Note

이 절에서는 이 PEP에 따라 공식적으로 사용 중단되는 널리 사용되는 기능을 대체할 몇 가지 대안을 제안합니다. 이 내용은 작성 시점에는 최신이지만, 최신 상태로 유지되지는 않습니다.

이러한 모듈이나 타입에는 setuptools가 가장 적합한 대체재입니다.

  • distutils.ccompiler
  • distutils.cmd.Command
  • distutils.command
  • distutils.config
  • distutils.core.Distribution
  • distutils.errors

다음 모듈이나 타입에 대해서는, 지정된 표준 기반 파이썬 패키징 협회(Python Packaging Authority) 패키지를 사용하십시오:

  • distutils.versionpackaging 패키지를 사용

다음 모듈이나 함수에 대해서는, 아래 표시된 표준 라이브러리 모듈을 사용하십시오:

  • distutils.fancy_getoptargparse 모듈을 사용
  • distutils.spawn.find_executableshutil.which 함수를 사용
  • distutils.spawn.spawnsubprocess.run 함수를 사용
  • distutils.sysconfigsysconfig 모듈을 사용
  • distutils.util.get_platformplatform 모듈을 사용

여기서 언급되지 않은 다른 함수들과 마찬가지로, 이러한 함수들에 대해서는 직접 해당 기능을 재구현해야합니다. 레거시 문서는 https://docs.python.org/3.9/distutils/apiref.html 에서 찾아볼 수 있습니다.

  • distutils.dir_util.create_tree
  • distutils.util.change_root
  • distutils.util.strtobool

기각된 아이디어

폐지하되 삭제는 하지 않는 방안

이 접근 방식의 주된 문제점은, distutils가 플랫폼 차이로 인해 가장 자주 깨진다는 점에 있으며, 이는 유지보수가 없으면 파이썬 릴리스와 시기가 어긋나며 작동을 멈추게 됨을 의미합니다. 이로 인해 라이브러리들이 언제 작동을 멈출지 신뢰성 있게 감지하는 것이 불가능해집니다.

이와 대조적으로, 이 PEP는 distutils가 작동을 멈추는 구체적인 날짜를 사전에 충분히 미리 알려주는 방식을 제안하며, 그때까지는 API를 깨뜨리지 않기로 약속합니다. 이는 유지보수자들에게 예측 가능한 일정을 제공하고, 어떤 방식으로든 발생하는 깨짐이 사용자들이 이미 동작 변화를 예상하고 있을 시점에 일어나도록 보장하며, 신뢰성 있는 감지 메커니즘(구체적으로는 import distutils가 예외를 발생시킨다는 점)을 제공합니다.

마지막으로, distutils가 어떤 형태로든 표준 라이브러리에 남아 있는 한, setuptools를 포함하여 대체품(shim)이나 대안을 제공하는 서드파티 패키지들과 충돌을 일으킬 것입니다. 알려진 버전에서 해당 패키지를 완전히 제거하면, 서드파티가 안전하게 대체물을 사용할 수 있게됩니다.

setuptools와 유사한 기능만 폐지하는 방안

이 제안은 남는 부분을 유지보수할 자원봉사자가 존재한다고 가정하는데, 이는 사실이 아닙니다. 또한 어떤 기능이 남아야 하는지 누군가 알고 있다는 것을 암시하는데, 논의에서 드러났듯 이는 전혀 명확하지 않습니다.

distutils의 대부분의 헬퍼 함수들은 이미 지원되는(그리고 개선된) 대안을 가지고 있으며, 대개는 표준 라이브러리 안에 있으므로, 하위 호환성을 깨뜨리지 않고서는 레거시 버전에 대해 할 수 있는 일이 거의 없습니다. (그리고 유지보수자들이 코드를 갱신해야 하는 방식의 어떤 깨짐이든, 사실상 다른 함수를 임포트하도록 요구하는 것과 동등합니다.)

앞 절의 마지막 논점 역시 여기에도 적용됩니다.

참고 문헌