setuptools 대 distutils : 왜 distutils가 여전히 중요한가?


143

파이썬 프로젝트를 패키징하고 설명하는 데 사용할 수있는 도구의 혼란 역사를 가지고 이러한 포함 distutils, 표준 라이브러리에서 distribute, distutils2그리고 setuptools(어쩌면 더). 것으로 보인다 distributedistutils2찬성 중단했다 setuptools있는 잎이 개 경쟁하는 표준.

내가 이해 setuptools하는 것보다 훨씬 더 많은 옵션 (예 : 종속성 선언, 테스트 등)을 제공 distutils하지만 Python 표준 라이브러리에는 포함되어 있지 않습니다 (아직?).

파이썬 포장 사용 설명서 [ 1 ] 지금 권장합니다

setuptools프로젝트를 정의하고 소스 분배를 작성하는 데 사용하십시오 .

그리고 설명 :

distutils많은 프로젝트에 순수 를 사용할 수 있지만 다른 프로젝트에 대한 종속성 정의를 지원하지 않으며에서 제공하는 패키지 메타 데이터를 올바르게 자동으로 채우는 몇 ​​가지 편리한 유틸리티가 없습니다 setuptools. 표준 라이브러리 외부의 setuptools는 다른 버전의 Python에서보다 일관된 기능 세트를 제공하며 (와 달리 distutils) setuptools지원되는 모든 버전에서 곧 출시 될 "Metadata 2.0"표준 형식을 생성하도록 업데이트됩니다.

를 사용하기로 선택한 프로젝트의 경우에도 distutilspip는 사전 빌드 된 휠 파일에서 설치하지 않고 소스에서 직접 이러한 프로젝트를 설치할 때 실제로 setuptools대신 프로젝트를 사용하여 빌드합니다 .

그러나 다양한 프로젝트의 setup.py 파일을 살펴보면 이것이 실제 표준이 아닌 것으로 보입니다. 많은 패키지가 여전히 사용 중이며 distutils지원하는 패키지 는 폴백 가져 오기 등 을 통해 setuptools종종 혼합 setuptools됩니다 distutils.

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

모두 설치할 수있는 설치 작성하는 방법을 찾기위한 시도를 다음 setuptoolsdistutils. distutils설정 기능의 종속성을 지원하지 않기 때문에 여기에는 종종 다양한 오류 발생 종속성 검사 방법이 포함됩니다 .

왜 사람들은 여전히 지원하기위한 추가적인 노력을하고 있습니다 distutils- 한 사실 setuptools표준 라이브러리에있는 유일한 이유는 아니다는? 지원 만하는 setup.py 파일을 distutils작성할 때의 장점 과 단점이 있습니다.setuptools


4
distutils에 다시 통합setuptools 되었지만 사용하도록 작성된 기존 앱 distutils이 있으며 올바른 표준으로 마이그레이션하는 데 드는 비용이 있습니다.
metatoaster

3
"distribut 및 distutils2가 setuptools를 위해 중단 된 것 같습니다."올바른, distribution 은 setuptools의 랩퍼 일 뿐이며 distutils2 는 죽었습니다.
kay-SE는 사악하다

1
setuptools향상된 대안이다 distutils"고하지만, 참고 권장 설치 프로그램이 모든 setup.py 스크립트를 실행 setuptools하는 경우에도 스크립트 자체 만 수입distutils (" 소스 )
user2314737

답변:


77

이 SO 질문을 살펴보십시오. 모든 패키징 방법을 잘 설명하고 있으며 질문과 대답에 어느 정도 도움이 될 수 있습니다. 배포, distutils, setuptools 및 distutils2의 차이점

Distutils 는 여전히 Python으로 패키징하기위한 표준 도구입니다. 표준 라이브러리 (Python 2 및 Python 3.0 ~ 3.3)에 포함되어 있습니다. 간단한 Python 배포에는 유용하지만 기능이 부족합니다. setup.py 스크립트로 가져올 수있는 distutils Python 패키지를 소개합니다.

Setuptools 는 Distutils의 한계를 극복하기 위해 개발되었으며 표준 라이브러리에는 포함되어 있지 않습니다. easy_install이라는 명령 줄 유틸리티가 도입되었습니다. 또한 setup.py 스크립트로 가져올 수있는 setuptools Python 패키지와 코드로 가져 와서 배포와 함께 설치된 데이터 파일을 찾을 수있는 pkg_resources Python 패키지를 소개했습니다. 단점 중 하나는 distutils Python 패키지를 원숭이 패치한다는 것입니다. pip와 잘 작동합니다. 최신 버전은 2013 년 7 월에 릴리스되었습니다.

따라서 setuptools가 distutils보다 선호되어야한다는 것을 알 수 있으며 질문이 어디에서 나오는지 알지만 distutils는 곧 일부 지원되는 기존 프로그램과 함께 많은 경우에 사용되므로 곧 지원을 잃지 않습니다 . 그리고 레거시 프로그램에서 이러한 종류의 변경은 상당히 고통스럽고 비 호환성과 같은 몇 가지 문제가 발생하여 개발자가 소스 코드를 다시 작성해야 할 수도 있습니다. 따라서 distutils는 표준 python 라이브러리의 일부이지만 setuptools는 그렇지 않습니다. 따라서 오늘날과 같이 파이썬 프로그램을 작성하는 경우 setuptools를 사용하지만 distutils가 없으면 setuptools가 존재하지 않았 음을 명심하십시오.


3
"Distutils는 여전히 Python으로 패키징하기위한 표준 도구입니다." Python Packaging 사용자 안내서와 모순됩니다.
cel

1
나는 그렇게 생각하지 않으며 setuptools 가 표준 이라고 명시 적으로 말하고 있습니까 ? 또한 해당 문구는 내가 제공 한 웹 사이트에서 인용되었으므로 내 말이 아닙니다. 그러나 그것은 다른 많은 사람들에게 동의하는 의견입니다.

커뮤니티가 당신과 동의하는 것 같아서 현상금을 수여했습니다. 불행히도이 질문은 내가 원했던만큼 많은 관심을받지 못했습니다.
cel

easy_install은 setuptools를 거부 한 주된 이유입니다.이 패키지를 사용하는 패키지 (재 포장하기가 더 쉬움)에서 큰 문제의 원인이되었습니다. 다른 기능은 괜찮습니다.
스튜어트 Gathman

14

setuptools가 표준 라이브러리에없는 유일한 이유입니다.

한 가지 이유가 있습니다. 다음은 NumPysetup.py 에서 나온 것입니다 .

if len(sys.argv) >= 2 and ('--help' in sys.argv[1:] or
        sys.argv[1] in ('--help-commands', 'egg_info', '--version',
                        'clean')):
    # Use setuptools for these commands (they don't work well or at all
    # with distutils).  For normal builds use distutils.
    try:
        from setuptools import setup
    except ImportError:
        from distutils.core import setup

따라서 NumPy는 setuptools그것을 찾을 수 있으면 선호 합니다. 그러나 SciPy 는 일부 상황에서 선호하도록 패치 될 때 까지이 작업을 수행했습니다 distutils. 커밋 로그 인용 :

Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.

물론, 합병 사이 setuptools와는 distribute때가되면 모든 것을 해결해야하지만, 많은 패키지는 여전히 파이썬 2.6 설치를 지원해야합니다.


1
distribute포크였으며 setuptools이제 다시 병합되었습니다.
R4444

10

setuptools가 의심 할 여지없이 더 나은 도구 세트 임에도 불구하고 여전히 distutils에 대해 이야기하고 사용하는 몇 가지 이유가 있습니다.

첫째, distutils는 어디에서나 사용할 수 있습니다. 다른 사람과 공유하기위한 모듈을 구축하려는 경우 복잡한 요구 사항이없는 경우 업무용 컴퓨터에서 사용할 수 있습니다. 이전 버전의 파이썬을 지원해야하거나 익숙하지 않은 환경에서 작업하는 경우 특히 중요합니다.

둘째, setuptools는 distutils를 향상시킵니다. 따라서 distutils 도구 세트를 모델로하여 모든 구조를 가져옵니다. setuptools 설명서는 독자가 distutils에 익숙하다고 가정하고 기본 도구 세트를 향상시키는 방법 만 문서화합니다. distutils가 방언을 정의하고 setuptools가 해당 방언을 향상 시킨다고 생각할 수 있습니다.

새로운 프로젝트에 대한 나의 개인적인 접근은 distutils를 사용할 것이라는 가정에서 시작됩니다. 프로젝트가 setuptools의 기능을 요구하도록 성장함에 따라 업그레이드를해야합니다. setuptools는 distutils를 대체하는 드롭 인입니다 .setup.py의 한 줄 변경입니다.


답변 주셔서 감사합니다. setuptools 설치를 부트 스트랩 할 수 있기 때문에 가용성 인수가 그렇게 중요하지 않다고 생각합니다. distutils가 충분한 기능을 제공한다면 그것을 사용하는 것이 합리적이라는 것을 알았습니다. 그러나 내 생각에 distutils와 setuptools를 혼합하는 것은 목표를 달성하는 매우 깨끗한 방법이 아닙니다. @larsmans는 그의 대답에서 setuptools의 일부 어려움을 보여 주었다.
cel

9

기본적으로 책임 분담 때문입니다.

setuptoolsPython 핵심 라이브러리가 아닌 타사에서 관리하기 때문에 Python 표준 라이브러리의 일부가 아닙니다. 무엇을 의미합니까?

  • 핵심 테스트 스위트에서 다루지 않으며 핵심 기능에 의존하지 않습니다.
  • 자체적 으로 애드온 모듈 (위치, 가져 오기 수단, C 확장의 이진 인터페이스 등)에 대한 핵심 표준을 설정 하지는 않습니다 .
  • 파이썬 릴리스와 독립적으로 업데이트되고 릴리스됩니다.

효과적으로 핵심 팀은 distutils의 범위를 좁혀 "핵심 표준"과 "최소한 필요한 컴파일"부분을 그대로 유지하면서 그 밖의 모든 내용 (확장 된 컴파일러 / 패키지 형식 / 지원 대상) 을 제 3 자에게 남겨 두었습니다 . 이전에 이러한 "확장 된 부분"을 다루고 있던 코드는 이전 버전과의 호환성을 위해 오래 되었습니다.

Python 모듈 배포 에서 — Python 2.7.12 설명서 :

직접 사용 distutils이 단계적으로 폐지되는 동안 , 현재 포장 및 유통 인프라의 기반을 마련했으며 표준 라이브러리의 일부일뿐 아니라 다른 방법으로도 이름이 유지됩니다 (예 : 메일 링리스트 이름). 파이썬 패키징 표준 개발을 조정하는 데 사용됩니다).

다른 운영체제를위한 패키지는 제공 할 수 마찬가지로 가능성 setuptoolspip별도로 - 상기 이유

  • 또한 시스템에 이미 다른 패키지 관리자가있을 때 필요하지 않거나 유지 관리에 악영향을 미칩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.