Различия между distribute, distutils, setuptools и distutils2?



Ситуация



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



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






Проблема



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






Вопрос



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

566   7  

7 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Подробнее:

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

Примечание: ответ устарел, распространение теперь устарело.

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

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

в частности, 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 имеет следующие особенности:

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

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

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

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

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

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

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

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

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

эта тема, кажется, все еще находится в движении. По состоянию на 10-31-2013 "руководство пользователя Python Packaging"Быстрые Рекомендации определяет"какой набор инструментов в настоящее время рекомендуется". Он также ссылается на " будущее упаковки Python"

Comments

    Ничего не найдено.