Как настройки, дистрибутивы и пипсы связаны друг с другом?

Я преподавал сам Python в книге "Learn Python The Hard Way" (2-е издание). В упражнении 46 мне сказали, чтобы я прочитал "Пип", "Распространять" и несколько других пакетов.

Документация для пипса была достаточно ясной. Это позволяет мне устанавливать/удалять и обновлять пакеты. Читая документацию для распространения, она, по-видимому, делает то же самое:

Легко загружать, создавать, устанавливать, обновлять и удалять пакеты Python

Какая разница между pip и распространением, и как они соотносятся друг с другом?

Ответ 1

[ 2014-10 TL; DR: distribute мертв, используйте pip, новый setuptools и для двоичных распределений wheels. Еще ниже.]


[Исходный ответ]

Distribute is был вилкой старшего setuptools, поэтому почти все комментарии, которые следуют ниже, в равной степени относятся к Distribute и setuptools. Программа Setuptools была попыткой заполнить ряд отверстий в еще более старом стандартном пакете библиотеки Python, Distutils. В Setuptools добавлены функции, такие как автоматическая загрузка пакетов через интерфейс командной строки, easy_install и некоторый уровень управления зависимостями. Тем не менее, сегмент сообщества Python считает, что setuptools слишком навязчивый и имеет слишком много закулисных магии для некоторых своих функций.

pip - это интерфейс более высокого уровня поверх настроек setuptools или Distribute. Он использует их для выполнения многих своих функций, но избегает некоторых из их более противоречивых особенностей, таких как замятые яйца. pip также предоставляет функции, недоступные в setuptools, например, команду удаления и возможность определять фиксированные наборы требований и надежно воспроизводить набор пакетов. Ниже приведено более полное сравнение функций здесь.

Почему так много компонентов (и есть больше, например buildout)? Множество причин: решения должны работать на всех основных платформах, на которых поддерживается Python (например, Unix-y, Windows, Mac OS X), поэтому создание и установка представляют собой сложный набор проблем; как и многие проекты с открытым исходным кодом, Python по сути является волонтером, и многие разработчики не так уж заинтересованы в вопросах упаковки и установки; существует естественный консерватизм в отношении добавления основных стандартных недоказанных функций в стандартную библиотеку; различия во мнениях и т.д. и т.д.

В настоящий момент существует проект, предусматривающий замену Distutils и, возможно, некоторых надстроек надстройки. Он будет выпущен в стандартной библиотеке Python 3.3 в виде пакета packaging и в качестве дополнения для более старых версий Python как Distutils2.

Подводя итог, текущее соотношение:

pip -> [ setuptools | Distribute ] -> Distutils -> Python core
                                    |
    3rd party packages              |      included in Python
                                    |

UPDATE (2012-07). До отключения кода функции для Python 3.3 было решено, что packaging еще не был готов к выпуску в стандартной библиотеке, поэтому он был удален из выпуск 3.3. Работа будет продолжена на Distutils2, которая доступна через PyPI и на том, что будет включено в стандартную библиотеку для Python 3.4.


UPDATE (2014-10): В мире упаковки Python произошли дальнейшие изменения, так как этот ответ был последним.

  • Самое главное, что с середины 2013 года разрыв между setuptools и distribute был исцелен, а деятельность по развитию была объединена в новый проект setuptools. distribute теперь устарел и больше не поддерживается; используйте вместо этого новый setuptools но не используйте его easy_install как установщик.

  • pip стал де-факто и благословенным инструментом установки (для Python пакеты, не предоставленные другим менеджером пакетов) либо вне виртуальных сред (virtualenv или pyvenv).

  • Вместо старого setuptools bdist eggs wheels есть стать блаженным бинарным форматом распространения для пакетов Python.

  • Начиная с Python 3.4, версия pip с поддержкой wheel теперь поставляется с официальными установщиками python.org и исходных пакетов, и ожидается, что pip также будет включен в следующий релиз обслуживания Python 2.7 (2.7.9).

  • Distutils2 и packaging теперь неактивны.

Подробнее в новом разделе Распространение модулей Python в документах Python 3 и новом Руководство пользователя Python Packaging.