Различия между распределением, distutils, setuptools и distutils2?

Ситуация

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

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


Проблема

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


Вопрос

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

Ответ 1

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

Руководство пользователя Python Packaging заслуживает внимания. На каждой странице отображается "последняя проверенная" дата, поэтому вы можете проверить текущее руководство, и оно достаточно полно. Тот факт, что он размещен на субдомене 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, поэтому вам больше не нужно использовать Distribute. Фактически, версия на 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.

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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