Различия между распределением, 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+ лет спустя, является мертвой ссылкой. :)