Как setuptools, распространять и pip связаны друг с другом? - PullRequest
46 голосов
/ 18 декабря 2011

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

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

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

В чем разница между pip и распространением и какони связаны друг с другом?

1 Ответ

76 голосов
/ 18 декабря 2011

[ 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
                                    |

ОБНОВЛЕНИЕ (2012-07) : До обрезания кода функции для Python 3.3 было решено, что packaging еще не совсем готов к выпуску в стандартной библиотеке, поэтому он был удален из 3.3 релиз. Продолжится работа над Distutils2, который доступен через PyPI и над тем, что будет включено в стандартную библиотеку для Python 3.4.


ОБНОВЛЕНИЕ (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 .

...