Различия между дистрибутивом, distutils, setuptools и distutils2?

594

Ситуация

Я пытаюсь портировать библиотеку с открытым исходным кодом на Python 3. ( SymPy , если кому-то интересно.)

Итак, мне нужно запускать 2to3автоматически при сборке для Python 3. Для этого мне нужно использовать distribute. Поэтому мне нужно портировать текущую систему, которая (согласно doctest) есть distutils.


Проблема

К сожалению, я не уверен , что разница между этой modules- distutils, distribute, setuptools. Документация отрывочна как лучше, так как все они кажутся друг другом, и должны быть совместимы в большинстве случаев (но на самом деле не во всех)… и так далее, и так далее.


Вопрос

Может ли кто-нибудь объяснить различия? Что я должен использовать? Какое самое современное решение? (Кроме того, я бы также хотел получить руководство по портированию Distribute, но это немного выходит за рамки вопроса…)

VPeric
источник
22
Как запутанно? Я пришел на Python с фоном Java / C ++. В этих ситуациях распределение очень простое. С python я совершенно запутался в отношении всех этих систем распространения.
Раффи Хачадурян
75
Я согласен, у пакета / установки Python слишком много альтернатив без четких указаний сообщества.
Sabuncu
6
Я просто хотел связать эту связанную информацию на pip, не поддерживающем бинарные дистрибутивы lucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere
pixelbeat
@pixelbeat pip поддерживает установку колес (так называемые бинарные дистрибутивы), эта ссылка устарела.
Flimm

Ответы:

836

По состоянию на март 2020 года большинство других ответов на этот вопрос устарели на несколько лет. Когда вы сталкиваетесь с советами по вопросам упаковки Python, не забывайте смотреть дату публикации и не доверяйте устаревшей информации.

Руководство пользователя по упаковке Python стоит прочитать. На каждой странице отображается дата «последнего обновления», поэтому вы можете проверить актуальность руководства, и оно достаточно полное. Тот факт, что он размещен на поддомене python.org Python Software Foundation, просто добавляет ему доверия. Страница с резюме проекта особенно актуальна здесь.

Резюме инструментов:

Вот краткое изложение ландшафта упаковки Python:

Поддерживаемые инструменты:

Устаревшие / заброшенные инструменты:

  • distributeбыл вилкой setuptools. Он разделяет одно и то же пространство имен, поэтому, если у вас установлен Distribute, import setuptoolsон фактически импортирует пакет, распространяемый вместе с Distribute. Распространение было объединено обратно в Setuptools 0.7 , поэтому вам больше не нужно использовать Распространение. Фактически, версия на Pypi - это просто слой совместимости, который устанавливает Setuptools.

  • distutils2была попытка взять лучшее из distutils, setuptoolsа distributeи стать стандартным инструмент , включенным в стандартной библиотеке Python. Идея заключалась в том, что distutils2он будет распространяться для старых версий Python и distutils2будет переименован в packagingPython 3.3, который включит его в свою стандартную библиотеку. Эти планы не пошли, как задумано, и в настоящее время distutils2это заброшенный проект . Последний выпуск был в марте 2012 года, и его домашняя страница Pypi была наконец обновлена, чтобы отразить его смерть.

Другие:

Существуют и другие инструменты, если вам интересно, прочитайте Краткое изложение проекта в Руководстве пользователя по упаковке Python. Я не буду перечислять их все, чтобы не повторить эту страницу, и держать ответ соответствующий вопрос, который был только о том distribute, distutils, setuptoolsи distutils2.

Рекомендация:

Если все это является новым для вас, и вы не знаете, с чего начать, я бы порекомендовал учитьсяsetuptools вместе с pipи virtualenv, которые все очень хорошо работают вместе.

Если вы ищете в virtualenv, вы можете быть заинтересованы в этом вопросе: В чем разница между venv, pyvenv, pyenv, virtualenv, virtualenvwrapperи т.д.? , (Да, я знаю, я стону с тобой.)

Флимм
источник
2
@makeramen: смотрите эту ветку в списке рассылки .
Flimm
6
И не выглядит лучше: 'Distribute' is a now deprecated fork of the 'Setuptools' project.страница распространения PyPI.
KurzedMetal
3
@KurzedMetal, по словам ребят из SetupTools, setuptools 0.7 будет включать в себя как распространять, так и старый setuptools, восстанавливающий порядок в юниверсе. Так что вещи действительно значительно улучшатся!
Джон Макдоннелл
8
Руководство пользователя по упаковке Python будет содержать самую свежую информацию о состоянии упаковки Python. Это отметил Ник Кафлан на PyCon 2013 года .
imanuelcostigan
1
@Flimm Последнее редактирование прошло довольно давно. Бенто уже зрел?
Мартин Тома
251

Я сопровождающий distutils и участник distutils2 / package. Я говорил о упаковке Python на ConFoo 2011, и в эти дни я пишу расширенную версию. Это еще не опубликовано, так что вот выдержки, которые должны помочь определить вещи.

  • Distutils - это стандартный инструмент, используемый для упаковки. Он работает довольно хорошо для простых нужд, но ограничен и не тривиален для расширения.

  • Setuptools - это проект, родившийся из желания восполнить недостающую функциональность distutils и исследовать новые направления. В некоторых сообществах это де-факто стандарт. Он использует патчи обезьян и магию, которую не одобряют разработчики ядра Python.

  • Распространение - это форк Setuptools, который был запущен разработчиками, которые чувствовали, что темп его разработки был слишком медленным и что его было невозможно развить. Его развитие значительно замедлилось, когда distutils2 был запущен той же группой. Обновление 2013-август: дистрибутив снова объединен с setuptools и прекращен.

  • Distutils2 - это новая библиотека distutils, созданная как форк базы кода distutils, с хорошими идеями, взятыми из инструментов установки (некоторые из которых подробно обсуждались в PEP), и базовым установщиком, вдохновленным pip. Фактическое имя, которое вы используете для импорта Distutils2, находится packagingв стандартной библиотеке Python 3.3+ или distutils2в версиях 2.4+ и 3.1–3.2. (Бэкпорт будет доступен в ближайшее время.) Distutils2 не сделал релиз Python 3.3, и он был отложен.

Больше информации:

Я надеюсь закончить свое руководство в ближайшее время, оно будет содержать больше информации о сильных и слабых сторонах каждой библиотеки и руководство по переходу.

Эрик Араужо
источник
1
Нет. Distutils2 берет некоторые хорошие идеи из setuptools / distribue, после стандартизации (PEP) или нет (например, я наставляю студента GSoC, который добавляет команду разработки и автоматическое генерирование сценариев), но это никогда не будет вставкой замена: есть некоторые части, которые нам не нужны (яйца, интеграция VCS и т. д.). OTOH, у distutils2 есть некоторые вещи, которых нет у setuptools / distribution. Я думаю, что для облегчения перехода разработчики дистрибутива могут использовать distutils2 для поддержки новых стандартов и инструментов; Я также помню, что разработчик setuptools говорил, что он хочет поддерживать новые стандарты.
Эрик Араужо
1
Куда упал ez_setup во всем этом? Также есть ли обновления статуса distutils2?
Джеймс МакМэхон
2
@ ÉricAraujo Жаль слышать о задержке. Я действительно надеюсь, что он готов вовремя для 3.4! Я люблю Python, но упаковка всегда заставляла меня биться головой об стену. (Из других новостей, как
продвигается
9
@AlexisHuet Этот вид комментария был бы лучше, если бы он содержал ссылку на комментарий ниже (который вы можете получить с помощью shareкнопки).
erikbwork
2
возможно, вам следует обновить ответ, чтобы упомянуть, что он distributeбыл недавно добавлен обратно setuptools. Тот факт, что большая часть информации там устарела, добавляет путаницы
Amro
5

ПРИМЕЧАНИЕ. Ответ устарел. Распространение устарело. Этот ответ больше не действителен с момента создания Python Packaging Authority и проделал большую работу по его устранению.


Да, вы поняли. : -о я думаю, что в настоящее время предпочтительным пакетом является Distribute , который является форком setuptools, который является расширением distutils (оригинальная система упаковки). Setuptools не поддерживается, поэтому он разветвляется и переименовывается, однако при установке он использует имя пакета setuptools! Я думаю, что большинство разработчиков Python сейчас используют Distribute, и я могу точно сказать, что я использую.

Кит
источник
Для справки, я принял этот ответ, потому что он сказал мне ситуацию сейчас (и это является расширением отношений, о которых просто не упоминается картинка в другом ответе). И где-то вдоль дороги я также узнал, что сама документация обычно не знает, что она пытается сказать.
VPeric
2
@VPeric, действительно, документация отражает тот факт, что этот аспект python находится в состоянии потока / беспорядка.
Juanchopanza
2

Я понимаю, что ответил на ваш второстепенный вопрос, не обращаясь к несомненным предположениям в вашей первоначальной проблеме:

Я пытаюсь портировать библиотеку с открытым исходным кодом (SymPy, если кому-то интересно) на Python 3. Для этого мне нужно автоматически запускать 2to3 при сборке для Python 3.

Вы можете , не нужно . Другие стратегии описаны на http://docs.python.org/dev/howto/pyporting

Для этого мне нужно использовать распространять,

Вы можете :) distutils поддерживает преобразование 2to3 во время сборки для кода (не для строк документации) другим способом, который распространяет: http://docs.python.org/dev/howto/pyporting#during-installation

Эрик Араужо
источник
Спасибо, хотя мы уже решили решить эту проблему, написав наш скрипт для обработки преобразования. И да, я знал, что были и другие варианты, кроме использования 2to3, но SymPy - это сложная кодовая база (около 200k + строк в прошлый раз, когда я проверял), и использование 2to3 было единственной реалистичной стратегией. Еще раз спасибо, в любом случае!
VPeric
2

Обновление этого вопроса в конце 2014 года, когда, к счастью, хаос упаковки Python был значительно очищен менеджером пакетов " conda " из Continuum .

В частности, conda позволяет быстро создавать « среды ». Вы можете настроить свои среды с различными версиями Python. Например:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

создаст две ("py34" или "py26") среды Python с разными версиями Python.

После этого вы можете вызвать среду с определенной версией Python:

source activate <env name>

Эта функция кажется особенно полезной в вашем случае, когда вам приходится иметь дело с другой версией Python.

Кроме того, conda имеет следующие особенности:

  • Python агностик
  • Кроссплатформенный
  • Не требуются права администратора
  • Интеллектуальное управление зависимостями (с помощью SAT-решателя)
  • Прекрасно работает с C, Fortran и библиотеками системного уровня, с которыми вам, возможно, придется связываться

Этот последний пункт особенно важен, если вы находитесь в сфере научных вычислений.

Жюльен Частанг
источник