MEP11: 타사 종속성 #

이 MEP는 matplotlib의 타사 종속성이 처리되는 방식을 개선하려고 시도합니다.

상태 번호

완료 -- 병합해야 함

브랜치 및 풀 리퀘스트 #

#1157: 자동 종속성 해결 사용

#1290: 디번들 파이파싱

#1261: 6을 1.2로 업데이트

초록 #

matplotlib의 목표 중 하나는 설치를 가능한 한 쉽게 유지하는 것이었습니다. 이를 위해 일부 타사 종속성이 소스 트리에 포함되며 특정 상황에서 matplotlib와 함께 설치됩니다. 이 MEP는 해당 접근 방식의 일부 문제를 해결하고 일관성을 유지하면서 설치를 계속해서 편리하게 만드는 것을 목표로 합니다.

처음 수행되었을 때 setuptools , easy_installPyPI 는 신뢰할 수 있을 만큼 성숙하지 않았습니다. 그러나 현재 우리는 배포pip 도구의 "최신" 버전을 안전하게 활용할 수 있어야 합니다 .

matplotlib에는 Python 라이브러리와 C/C++ 라이브러리 모두에 대한 종속성이 있지만 이 MEP는 문제를 혼동하지 않도록 Python 라이브러리만 처리합니다. C 라이브러리는 더 크고 대부분 직교하는 문제 집합을 나타냅니다.

자세한 설명 #

matplotlib는 다음 타사 Python 라이브러리에 의존합니다.

  • 넘피

  • dateutil(순수 Python)

  • pytz(순수 파이썬)

  • 6 -- dateutil에 필요함(순수 Python)

  • pyparsing(순수 Python)

  • PIL(선택 사항)

  • GUI 프레임워크: pygtk, gobject, tkinter, PySide, PyQt4, wx(모두 선택 사항이지만 대화형 GUI에는 하나가 필요함)

현재 동작 #

소스에서 설치할 때 git checkout 또는 pip :

  • setup.py시도합니다 . 이것이 실패하면 설치가 실패합니다.import numpy

  • dateutil , pytzsix 각각에 대해 가져오기 를 setup.py시도합니다(최상위 네임스페이스에서). 실패하면 matplotlib는 라이브러리의 로컬 복사본을 최상위 네임스페이스에 설치합니다.

  • pyparsing 은 항상 matplotlib 네임스페이스 내부에 설치됩니다.

이 동작은 pip 와 함께 사용할 때 가장 놀랍 습니다. 이러한 모든 패키지에서 작동할 가능성이 높음에도 불구하고 pip 종속성 해결이 수행 되지 않기 때문 입니다.

보고에 따르면 pyparsing 이 matplotlib 네임스페이스에 설치되어 있어(#1290) 일부 사용자가 이를 matplotlib 관련 모듈이라고 생각하고 최상위 수준이 아닌 여기에서 가져오는 것으로 혼동했습니다.

Windows 설치 프로그램을 사용하여 설치할 때 dateutil , pytzsix 는 항상 최상위 레벨에 설치되어 해당 라이브러리의 이미 설치된 복사본을 잠재적으로 덮어씁니다.

TODO: OS-X 설치 프로그램의 동작을 설명합니다.

패키지 관리자(Debian, RedHat, MacPorts 등)를 사용하여 설치할 때 이 동작은 실제로 올바른 작업을 수행하며 matplotlib 패키지에는 dateutil , pytzsix 를 이러한 방식으로 처리한다는 사실을 처리하기 위한 특수 패치가 없습니다. . 그러나 우리가 어떤 접근 방식을 사용하든 해당 맥락에서 계속 작동하도록 주의를 기울여야 합니다.

matplotlib 트리에서 이러한 패키지를 유지 관리하고 최신 상태인지 확인하는 것은 유지 관리 부담입니다. 타사 순수 Python 라이브러리가 필요할 수 있는 고급 새 기능은 이러한 부담으로 인해 포함 장벽이 더 높습니다.

원하는 동작 #

타사 종속성은 pip , 배포PyPI 를 활용하여 정식 위치에서 다운로드 및 설치됩니다 .

dateutil , pytzpyparsing 은 선택적 종속성으로 만들어야 합니다. 물론 일부 기능이 설치되지 않으면 실패할 수 있습니다. 이를 통해 사용자는 특정 기능을 설치하기를 원하는지 여부를 결정할 수 있습니다.

구현 #

소스에서 설치하고 사용자에게 모든 C 레벨 컴파일러와 종속성이 있다고 가정하면 배포 를 사용하고 여기 의 지침을 따르면 매우 쉽게 수행할 수 있습니다 . matplotlib 라이브러리 코드에 대해 예상되는 유일한 변경 사항은 matplotlib 내에서가 아니라 최상위 네임스페이스에서 pyparsing 을 가져오는 것입니다. 배포 를 사용하면 six 에 대한 직접적인 종속성을 제거할 수도 있습니다 . 엄밀히 말하면 dateutil 의 직접적인 종속성일 뿐이기 때문 입니다.

바이너리 설치의 경우 여러 가지 대안이 있습니다(여기서는 최고/가장 어려운 것에서 최악/가장 쉬운 순으로 정렬됨).

  1. distutils wininst 설치 프로그램을 사용하면 설치 후 스크립트를 실행할 수 있습니다. 이 스크립트가 pip 를 실행하여 다른 종속성을 설치하도록 할 수 있습니다. ( 이전에 그 땅을 밟은 사람 은 이 스레드 를 참조하십시오).

  2. 설치 프로그램에서 dateutil , pytz , sixpyparsing 을 계속 제공 하되 아직 찾을 수 없는 경우 에만 post-install-script를 사용하여 설치 하십시오.

  3. 이러한 모든 패키지를 (새) matplotlib.extern 네임스페이스 내부로 이동하여 외부 사용자가 외부 패키지임을 분명히 알 수 있도록 합니다. 핵심 matplotlib 코드베이스에 일부 조건부 가져오기를 추가하여 dateutil (최상위 수준)이 먼저 시도되고 실패하면 matplotlib.extern.dateutil사용됩니다.

2와 3은 여전히 ​​트리에서 이러한 패키지의 복사본을 유지 관리해야 하므로 바람직하지 않습니다. 이는 바이너리 설치 프로그램에서만 덜 사용된다는 사실로 인해 악화됩니다. 이 3가지 접근 방식 중 어느 것도 설치 프로그램을 사용하여 수동으로 설치해야 하는 Numpy를 다루지 않습니다.

TODO: 이것은 Mac OS-X 설치 프로그램과 어떤 관련이 있습니까?

이전 버전과의 호환성 #

현재 matplotlib는 타사 의존성 및 인터넷 연결 없이 시스템의 소스에서 설치할 수 있습니다. 이 변경 후 처음으로 matplotlib를 설치하려면 인터넷 연결(및 작동하는 PyPI)이 필요합니다. (후속 matplotlib 업데이트 또는 개발 작업은 네트워크에 액세스하지 않고 실행됩니다.)

대안 #

바이너리 에그 배포는 유용한 솔루션처럼 느껴지지 않습니다. 이를 위해서는 먼저 easy_install 을 설치해야 하며 Windows 사용자는 일반적으로 잘 알려진 설치 프로그램 .exe이나 .msi기본적으로 작동하는 설치 프로그램을 선호합니다.