Различия между дистрибутивом, distutils, setuptools и distutils2? - PullRequest
581 голосов
/ 14 июня 2011

Ситуация

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

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


Проблема

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


Вопрос

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

Ответы [ 7 ]

819 голосов
/ 07 февраля 2013

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

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

Сводка инструментов:

Вот краткий обзор упаковочной среды Python в январе 2017 года:

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

  • Distutils по-прежнему является стандартным инструментом для упаковки в Python. Он включен в стандартную библиотеку (Python 2 и Python 3.0 до 3.6). Это полезно для простых дистрибутивов Python, но не имеет функций. В нем представлен пакет distutils Python, который можно импортировать в сценарий setup.py.

  • Setuptools был разработан для преодоления ограничений Distutils и не входит в стандартную библиотеку. Он представил утилиту командной строки под названием easy_install. Он также представил пакет setuptools Python, который можно импортировать в сценарий setup.py, и пакет pkg_resources Python, который можно импортировать в код для поиска файлов данных, установленных с дистрибутивом. Один из его недостатков заключается в том, что он исправляет пакет Python distutils. Он должен хорошо работать с pip. Он видит регулярные выпуски.

  • scikit-build - это улучшенный генератор системы сборки, который внутренне использует CMake для сборки скомпилированных расширений Python. Поскольку scikit-build не основан на distutils, он не имеет никаких ограничений. Когда присутствует ninja-build, scikit-build может компилировать большие проекты в три раза быстрее, чем альтернативные. Он должен хорошо работать с pip. Он видит регулярные выпуски.

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

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

  • Distutils2 была попыткой использовать лучшее из Distutils, Setuptools и Distribute и стать стандартным инструментом, включенным в стандартную библиотеку Python. Идея заключалась в том, что Distutils2 будет распространяться для старых версий Python, и что Distutils2 будет переименован в packaging для Python 3.3, который включит его в свою стандартную библиотеку. Однако эти планы пошли не так, как предполагалось, и в настоящее время Distutils2 является заброшенным проектом . Последний выпуск был в марте 2012 года, и его домашняя страница Pypi была наконец обновлена, чтобы отразить его смерть.

Программное обеспечение Alpha:

  • Distlib - это инструмент, нацеленный на реализацию подмножества функциональных возможностей предыдущих инструментов, но только тех функций, которые очень четко определены в принятых PEP.Это один из инструментов PyPA (Python Package Authority), и, надеюсь, он когда-нибудь будет включен в стандартную библиотеку Python. Это все еще считается альфа-программным обеспечением, поэтому конечные пользователи должны остерегаться.

  • Есть еще пара инструментов (например, Bento), но я не буду упоминать их, так как они слишком малопонятны или ниши, или ранние, или неразвитые для этого поста с ответом, или же они не являются прямыми альтернативами.

    Итак, в заключение, из всех этих опций Я бы порекомендовал Setuptools , если только ваши требования не очень простые и вам нужен только Distutils.Setuptools очень хорошо работает с Virtualenv и Pip, инструментами, которые я очень рекомендую.Virtualenv и Pip могут считаться официальными, поскольку они являются частью PyPA, и Python 3 теперь поставляется с ensurepip (что помогает вам устанавливать pip в некоторых системах).

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

    В качестве дополнительного примечания я рекомендую использовать Virtualenv 1.10 или выше, поскольку это первый выпуск, который распознает слияние Setuptools / Distribute для обоих Python 2.и 3.

251 голосов
/ 29 июня 2011

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

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

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

  • Distribute - это форк 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, и он был приостановлен.

Дополнительная информация:

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

6 голосов
/ 14 июня 2011

ПРИМЕЧАНИЕ. Ответ устарел, распространение теперь устарело.

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

5 голосов
/ 03 октября 2014

Многие люди жаловались здесь на отсутствие четкого руководства сообщества по этому вопросу.

В настоящее время это выглядит как лучший авторитетный источник рекомендаций по инструментам: https://packaging.python.org/en/latest/current.html#tool-recommendations

3 голосов
/ 30 сентября 2014

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

В частности, conda позволяет быстро создавать conda " environment ".Вы можете настроить свои среды с различными версиями 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 и системного уровня, с которыми вам может потребоваться связать

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

3 голосов
/ 29 июля 2011

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

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

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

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

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

1 голос
/ 01 ноября 2013

Эта тема, кажется, все еще в движении.По состоянию на 10-31-2013 «Руководство пользователя по упаковке Python» Краткие рекомендации определяет «какой набор инструментов рекомендуется в настоящее время».Раньше он ссылался на «Будущее упаковки Python», которое теперь, 20.01.2009, более 5 лет спустя, является мертвой ссылкой.:)

...