it-swarm-ru.tech

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

Ситуация

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

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


Эта проблема

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


Вопрос

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

579
VPeric

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

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

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

Вот краткое описание ландшафта упаковки 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, который можно импортировать в код для поиска файлов данных, установленных с дистрибутивом. Один из его недостатков заключается в том, что он исправляет пакет distutils Python. Он должен хорошо работать с 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 была наконец обновлена, чтобы отразить его смерть.

Альфа-программное обеспечение:

  • 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.

816
Flimm

Я сопровождающий 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, и он был приостановлен.

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

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

251
Éric Araujo

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

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

6
Keith

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

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

5
Lucas Cimon

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

В частности, 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
Julien Chastang

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

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

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

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

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

3
Éric Araujo

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

1
Love and peace - Joe Codeswell