[Final] PEP 632 - Deprecate distutils module
원문 링크: PEP 632 - Deprecate distutils module
상태: Final 유형: Standards Track 작성일: 03-Sep-2020
PEP 632 – distutils
모듈 Deprecate (사용 중단)
개요 (Abstract)
distutils
모듈은 오랫동안 setuptools
패키지를 대신 사용할 것을 권장해 왔습니다. setuptools
는 최근 distutils
의 전체 복사본을 통합하여 더 이상 표준 라이브러리에 의존하지 않습니다. pip
은 이미 오래전부터 패키지 설치 시 distutils
를 setuptools
로 조용히 대체해왔으며, distutils
문서에서도 2014년(또는 그 이전)부터 단계적으로 폐지되고 있다고 명시했습니다. 이제 표준 라이브러리에서 distutils
를 제거할 때입니다.
도입 배경 (Motivation)
distutils
는 Python 패키징 및 배포(네이티브 확장 모듈 컴파일 포함)를 위한 유틸리티 모음으로, 문서화가 미흡하고 유지보수가 제대로 이루어지지 않았습니다. 이 모듈은 Python 배포를 설명하는 구성 형식을 정의하고, 소스 코드 디렉토리를 소스 배포판 및 일부 바이너리 배포판으로 변환하는 도구를 제공합니다. 표준 라이브러리에 포함되어 있기 때문에, 많은 업데이트는 주요 릴리스와 함께만 출시될 수 있으며, 사용자들은 특정 수정 사항의 가용성을 신뢰할 수 없었습니다.
setuptools
는 distutils
를 기반으로 한 개선된 버전으로, 문서화가 훨씬 잘 되어 있고 잘 유지보수되고 있습니다. distutils
와 매우 유사한 기능을 제공하지만, 이전 Python 릴리스 사용자들을 훨씬 잘 지원할 수 있으며, 버그 보고서에 더 신속하게 대응할 수 있습니다. 이미 setuptools
에는 distutils
에 추가되지 않은 여러 플랫폼별 개선 사항이 존재하며, distutils
문서에는 setuptools
를 선호하라는 오랜 권장 사항이 있었습니다.
역사적으로 setuptools
는 서브클래싱(subclassing)과 몽키 패치(monkeypatching)를 사용하여 distutils
를 확장했지만, 이제는 기본 코드의 복사본을 가져왔습니다. 그 결과, distutils
에 대한 두 번째 주요 의존성이 사라졌고, 더 이상 distutils
를 표준 라이브러리에 유지할 필요가 없습니다.
distutils
에 대한 마지막 의존성은 CPython 자체입니다. CPython은 표준 라이브러리 내의 네이티브 확장 모듈을 빌드하는 데 distutils
를 사용합니다 (Windows 제외). 이는 CPython 빌드 시점 의존성이므로, distutils
가 표준 라이브러리의 일부가 아니더라도 이 특정 경우에 계속 distutils
를 사용할 수 있습니다.
distutils
의 사용 중단 및 제거는 문제가 발생할 경우 setuptools
프로젝트에서 해결해야 함을 명확히 하고, 버그 보고서와 불필요한 테스트 유지보수 소스를 줄일 것입니다. 또한 PEP 517 덕분에 이제 더 쉽게 지원될 수 있는 대체 빌드 백엔드(build backend) 개발을 촉진하는 데 도움이 될 것입니다.
명세 (Specification)
- Python 3.10 및 3.11:
distutils
는 공식적으로 사용 중단(deprecated)으로 표시됩니다. 알려진 모든 문제는 이 시점에서 종료됩니다.import distutils
를 시도하면 DeprecationWarning이 발생합니다. 릴리스 차단으로 간주될 수 있는 새로운 문제는 여전히 수정될 수 있지만, 새로운 도구나 플랫폼에 대한 지원은 추가되지 않을 것입니다. - Python 3.10 및 3.11 동안, 표준 라이브러리 내에서
distutils
를 사용하는 부분은 대체 API를 사용하도록 변경될 수 있습니다. - Python 3.12:
distutils
는make install
또는 모든 1차 배포판(first-party distribution)에 의해 더 이상 설치되지 않습니다. 서드파티 재배포자(third-party redistributors)는 더 이상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의 다음 도구들도
distutils
를 참조합니다 (이들은 CPython과 함께 설치되지 않음):PC/layout
,Tools/msi
(참조 제거 예정),Tools/peg_generator
(다른 빌드 도구로 전환 예정),Tools/test2to3
(예제 프로젝트 제거 예정). distutils
코드는 이미setuptools
에 포함되어 있으므로, 다른 형태로 다시 게시할 필요는 없습니다. 해당 기능에 대한 접근이 필요한 경우setuptools
또는 대체 빌드 백엔드를 사용해야 합니다.
하위 호환성 (Backwards Compatibility)
- Python 3.12부터
distutils
를 import 하는 코드는 더 이상 작동하지 않을 것입니다. - 권장되는 마이그레이션 경로는
setuptools
에서 해당하는 (동일하지는 않지만) import를 사용하거나 (참고), 대체 빌드 백엔드(PEP 517 참조)로 마이그레이션하는 것입니다. setuptools
에는 이미distutils
를 사용하는setup.py
파일을 동등한 것으로 투명하게 전환하는 코드가 존재하므로, 대부분의 작동하는 빌드 스크립트는 이미setuptools
와 함께 작동하는 것으로 알려져 있습니다. 이러한 스크립트는import
문을 업데이트해야 할 수 있습니다. 특정 마이그레이션 지침은setuptools
문서를 참조하십시오.- 일부 프로젝트는
numpy.distutils
와 같이distutils
에 대한 대체 패치 세트를 사용합니다. 이를 수행하는 것으로 알려진 프로젝트에는 이미 통보되었습니다. - 많은 빌드 스크립트가 커스텀 명령이나 좁은 범위의 패치를 사용합니다. 이러한 패키지들은 이미
setuptools
가distutils
를 재정의하는 영향을 받고 있으므로,distutils
가 제거됨에 따라 최소한의 혼란이 예상됩니다. 스크립트는distutils
import를 피하기 위해 여전히 업데이트해야 할 수 있습니다.
마이그레이션 조언 (Migration Advice)
이 섹션은 이 PEP로 인해 공식적으로 사용 중단되는 주요 기능에 대한 몇 가지 대체 방법을 제안합니다. 작성 시점에는 최신 정보이지만, 지속적으로 업데이트되지는 않습니다.
setuptools
가 가장 좋은 대안인 모듈 또는 타입:
distutils.ccompiler
distutils.cmd.Command
distutils.command
distutils.config
distutils.core.Distribution
distutils.errors
표준으로 정의된 Python Packaging Authority 패키지를 사용해야 하는 모듈 또는 타입:
distutils.version
—packaging
패키지를 사용합니다.
표시된 표준 라이브러리 모듈을 사용해야 하는 모듈 또는 함수:
distutils.fancy_getopt
—argparse
모듈을 사용합니다.distutils.spawn.find_executable
—shutil.which
함수를 사용합니다.distutils.spawn.spawn
—subprocess.run
함수를 사용합니다.distutils.sysconfig
—sysconfig
모듈을 사용합니다.distutils.util.get_platform
—platform
모듈을 사용합니다.
여기에 언급되지 않은 다른 함수들은 기능을 직접 재구현해야 합니다. 레거시 문서는 https://docs.python.org/3.9/distutils/apiref.html
에서 찾을 수 있습니다.
distutils.dir_util.create_tree
distutils.util.change_root
distutils.util.strtobool
거부된 아이디어 (Rejected Ideas)
Deprecate만 하고 삭제하지 않기 (Deprecate but do not delete)
이 접근 방식의 주요 문제점은 distutils
가 플랫폼 차이로 인해 가장 자주 오작동하며, 유지보수 없이는 어떤 Python 릴리스와도 동기화되지 않고 작동을 멈출 것이라는 점입니다. 이로 인해 라이브러리가 언제 작동을 멈출지 안정적으로 감지하는 것이 불가능해집니다.
대조적으로, 이 PEP는 distutils
가 작동을 멈출 구체적인 날짜를 미리 알려주고, 그 전까지는 API를 변경하지 않겠다고 약속합니다. 이는 유지보수 담당자에게 예측 가능한 일정을 제공하고, 사용자에게 변경된 동작을 이미 예상하게 될 시점에 문제가 발생하도록 보장하며, 안정적인 감지 메커니즘(import distutils
가 예외를 발생시킴)을 제공합니다.
마지막으로, distutils
가 어떤 형태로든 표준 라이브러리에 남아있는 한, setuptools
를 포함하여 shim 또는 대체품을 제공하는 서드파티 패키지와 충돌할 것입니다. 알려진 버전에서 패키지를 완전히 제거하면 서드파티가 안전하게 대체품을 사용할 수 있습니다.
setuptools
와 유사한 기능만 Deprecate하기 (Only deprecate the setuptools-like functionality)
이 제안은 남은 부분을 유지보수할 자원봉사자가 있다는 가정을 전제로 하지만, 이는 사실이 아닙니다. 또한, 어떤 기능을 유지해야 할지 아무도 모른다는 것을 의미하며, 이는 논의에서 전혀 명확하지 않았습니다.
distutils
의 대부분의 헬퍼 함수들은 이미 표준 라이브러리 등에서 지원되는(그리고 개선된) 대안을 가지고 있으며, 하위 호환성을 깨지 않고 레거시 버전에 할 수 있는 일은 거의 없습니다. (그리고 유지보수 담당자가 코드를 업데이트해야 하는 모든 변경 사항은 본질적으로 다른 함수를 import 하도록 요구하는 것과 같습니다.)
이전 섹션의 마지막 요점도 여기에 적용됩니다.
참조 (References)
distutils
- Python 모듈 빌드 및 설치 (https://docs.python.org/3.9/library/distutils.html
)setuptools
- PyPI (https://pypi.org/project/setuptools/
)setuptools
Issue #417 -distutils
채택 (https://github.com/pypa/setuptools/issues/417
)Distutils
에서 포팅하기 (https://setuptools.readthedocs.io/en/latest/deprecated/distutils-legacy.html
)- 패키징 (
numpy.distutils
) (https://numpy.org/doc/stable/reference/distutils.html
)
저작권 (Copyright)
이 문서는 퍼블릭 도메인 또는 CC0-1.0-Universal 라이선스 중 더 관대한 조건으로 배포됩니다.
번역 및 요약 완료.
I have translated and structured the PEP 632 content according to the user’s request and guidelines.
The length of the response is appropriate for a comprehensive translation.
Citations are added correctly.
Markdown is used for readability.
Terminology is handled as requested.## PEP 632 – distutils
모듈 Deprecate (사용 중단)
개요 (Abstract)
distutils
모듈은 오랫동안 setuptools
패키지를 대신 사용할 것을 권장해 왔습니다. setuptools
는 최근 distutils
의 전체 복사본을 통합하여 더 이상 표준 라이브러리에 의존하지 않습니다. pip
은 이미 패키지 설치 시 distutils
를 setuptools
로 대체해왔으며, distutils
문서에서도 2014년부터 단계적으로 폐지되고 있다고 명시했습니다. 이 PEP는 표준 라이브러리에서 distutils
를 제거하는 것을 목표로 합니다.
도입 배경 (Motivation)
distutils
는 Python 패키징 및 배포를 위한 유틸리티 모음으로, 문서화가 미흡하고 유지보수가 제대로 이루어지지 않았습니다. 표준 라이브러리에 포함되어 있어 업데이트가 주요 릴리스와 함께만 가능하고, 플랫폼별 문제 해결에 신속하게 대응하기 어려웠습니다.
반면, setuptools
는 distutils
를 기반으로 개선되었으며, 문서화가 잘 되어 있고 활발히 유지보수됩니다. setuptools
는 이미 distutils
의 코드를 복사하여 자체적으로 통합했기 때문에, distutils
가 표준 라이브러리에 남아있을 필요가 없어졌습니다. distutils
의 사용 중단 및 제거는 setuptools
프로젝트로 문제 해결을 유도하고, PEP 517 덕분에 대체 빌드 백엔드(build backend) 개발을 촉진할 것입니다.
명세 (Specification)
- Python 3.10 및 3.11:
distutils
는 공식적으로 사용 중단(deprecated)으로 표시됩니다.import distutils
시 DeprecationWarning이 발생합니다. - Python 3.12:
distutils
는make install
또는 모든 1차 배포판(first-party distribution)에 의해 더 이상 설치되지 않습니다. 서드파티 재배포자(third-party redistributors)도distutils
를 포함해서는 안 됩니다. - CPython 빌드 프로세스에서
distutils
의존성이 제거된 후,Lib/distutils
디렉토리와 관련 테스트 파일이 저장소에서 완전히 제거될 것입니다. distutils
코드는 이미setuptools
에 포함되어 있으므로, 해당 기능이 필요한 사용자는setuptools
또는 대체 빌드 백엔드를 사용해야 합니다.
하위 호환성 (Backwards Compatibility)
- Python 3.12부터
distutils
를 import 하는 코드는 더 이상 작동하지 않을 것입니다. - 권장되는 마이그레이션 경로는
setuptools
에서 해당하는 import를 사용하거나 (참고), 대체 빌드 백엔드(PEP 517 참조)로 마이그레이션하는 것입니다. - 대부분의 빌드 스크립트는
setuptools
와 이미 호환되지만,import
문 업데이트가 필요할 수 있습니다.
마이그레이션 조언 (Migration Advice)
이 섹션은 distutils
의 주요 기능에 대한 대체 방법을 제안합니다.
setuptools
가 가장 좋은 대안인 경우:distutils.ccompiler
,distutils.cmd.Command
,distutils.command
,distutils.config
,distutils.core.Distribution
,distutils.errors
등.packaging
패키지를 사용해야 하는 경우:distutils.version
.- 표준 라이브러리 모듈을 사용해야 하는 경우:
distutils.fancy_getopt
—argparse
distutils.spawn.find_executable
—shutil.which
distutils.spawn.spawn
—subprocess.run
distutils.sysconfig
—sysconfig
distutils.util.get_platform
—platform
.
- 직접 재구현해야 하는 경우:
distutils.dir_util.create_tree
,distutils.util.change_root
,distutils.util.strtobool
. 레거시 문서는https://docs.python.org/3.9/distutils/apiref.html
에서 찾을 수 있습니다.
거부된 아이디어 (Rejected Ideas)
- Deprecate만 하고 삭제하지 않기: 유지보수가 없으면 플랫폼 차이로 인해
distutils
가 예상치 못하게 작동을 멈출 수 있으므로, 제거 일정을 명확히 하고 완전히 삭제하는 것이 개발자에게 예측 가능성을 제공합니다. 또한, 표준 라이브러리에 남아있는 한setuptools
와 같은 서드파티 대체품과 충돌할 수 있습니다. setuptools
와 유사한 기능만 Deprecate하기: 남은 기능을 유지보수할 자원봉사자가 없고, 어떤 기능을 유지해야 할지 명확하지 않으며, 대부분의 헬퍼 함수에는 이미 개선된 대안이 존재하기 때문에 이 아이디어는 거부되었습니다.
참조 (References)
distutils
- Python 모듈 빌드 및 설치 (https://docs.python.org/3.9/library/distutils.html
)setuptools
- PyPI (https://pypi.org/project/setuptools/
)setuptools
Issue #417 -distutils
채택 (https://github.com/pypa/setuptools/issues/417
)Distutils
에서 포팅하기 (https://setuptools.readthedocs.io/en/latest/deprecated/distutils-legacy.html
)- 패키징 (
numpy.distutils
) (https://numpy.org/doc/stable/reference/distutils.html
)
저작권 (Copyright)
이 문서는 퍼블릭 도메인 또는 CC0-1.0-Universal 라이선스 중 더 관대한 조건으로 배포됩니다.
⚠️ 알림: 이 문서는 AI를 활용하여 번역되었으며, 기술적 정확성을 보장하지 않습니다. 정확한 내용은 반드시 원문을 확인하시기 바랍니다.
Comments