Ситуация
Я пытаюсь портировать библиотеку с открытым исходным кодом на Python 3. ( SymPy , если кому-то интересно.)
Итак, мне нужно запускать 2to3
автоматически при сборке для Python 3. Для этого мне нужно использовать distribute
. Поэтому мне нужно портировать текущую систему, которая (согласно doctest) есть distutils
.
Проблема
К сожалению, я не уверен , что разница между этой modules- distutils
, distribute
, setuptools
. Документация отрывочна как лучше, так как все они кажутся друг другом, и должны быть совместимы в большинстве случаев (но на самом деле не во всех)… и так далее, и так далее.
Вопрос
Может ли кто-нибудь объяснить различия? Что я должен использовать? Какое самое современное решение? (Кроме того, я бы также хотел получить руководство по портированию Distribute
, но это немного выходит за рамки вопроса…)
Ответы:
По состоянию на март 2020 года большинство других ответов на этот вопрос устарели на несколько лет. Когда вы сталкиваетесь с советами по вопросам упаковки Python, не забывайте смотреть дату публикации и не доверяйте устаревшей информации.
Руководство пользователя по упаковке Python стоит прочитать. На каждой странице отображается дата «последнего обновления», поэтому вы можете проверить актуальность руководства, и оно достаточно полное. Тот факт, что он размещен на поддомене python.org Python Software Foundation, просто добавляет ему доверия. Страница с резюме проекта особенно актуальна здесь.
Резюме инструментов:
Вот краткое изложение ландшафта упаковки Python:
Поддерживаемые инструменты:
distutils
до сих пор является стандартным инструментом для упаковки в Python. Он включен в стандартную библиотеку (Python 2 и Python 3). Это полезно для простых дистрибутивов Python, но не имеет функций. Он представляетdistutils
пакет Python, который можно импортировать в вашsetup.py
скрипт.distutils
раздел Руководства пользователя по пакету Pythonsetuptools
был разработан для преодоления ограничений Distutils и не входит в стандартную библиотеку. Он представил утилиту командной строки под названиемeasy_install
. Он также представилsetuptools
пакет Python, который можно импортировать в вашsetup.py
скрипт, иpkg_resources
пакет Python, который можно импортировать в ваш код, чтобы найти файлы данных, установленные вместе с дистрибутивом. Один из его недостатков в том, что он исправляетdistutils
пакет Python. Это должно хорошо работать сpip
. Это видит регулярные выпуски.setuptools
раздел Руководства пользователя по пакету Pythonscikit-build
улучшенный генератор системы сборки, который внутренне использует CMake для сборки скомпилированных расширений Python. Поскольку scikit-build не основан на distutils, он не имеет никаких ограничений. Когда присутствует ninja-build, scikit-build может компилировать большие проекты в три раза быстрее, чем альтернативные. Это должно хорошо работать сpip
.scikit-build
раздел Руководства пользователя по пакету Pythondistlib
это библиотека, которая обеспечивает функциональность, которая используется инструментами более высокого уровня, такими какpip
.distlib
раздел Руководства пользователя по пакету Pythonpackaging
также библиотека, которая обеспечивает функциональность, используемую инструментами более высокого уровня, такими какpip
иsetuptools
packaging
раздел Руководства пользователя по пакету PythonУстаревшие / заброшенные инструменты:
distribute
был вилкой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 была наконец обновлена, чтобы отразить его смерть.Другие:
Существуют и другие инструменты, если вам интересно, прочитайте Краткое изложение проекта в Руководстве пользователя по упаковке Python. Я не буду перечислять их все, чтобы не повторить эту страницу, и держать ответ соответствующий вопрос, который был только о том
distribute
,distutils
,setuptools
иdistutils2
.Рекомендация:
Если все это является новым для вас, и вы не знаете, с чего начать, я бы порекомендовал учиться
setuptools
вместе сpip
иvirtualenv
, которые все очень хорошо работают вместе.Если вы ищете в
virtualenv
, вы можете быть заинтересованы в этом вопросе: В чем разница междуvenv
,pyvenv
,pyenv
,virtualenv
,virtualenvwrapper
и т.д.? , (Да, я знаю, я стону с тобой.)источник
'Distribute' is a now deprecated fork of the 'Setuptools' project.
страница распространения PyPI.Я сопровождающий distutils и участник distutils2 / package. Я говорил о упаковке Python на ConFoo 2011, и в эти дни я пишу расширенную версию. Это еще не опубликовано, так что вот выдержки, которые должны помочь определить вещи.
Distutils - это стандартный инструмент, используемый для упаковки. Он работает довольно хорошо для простых нужд, но ограничен и не тривиален для расширения.
Setuptools - это проект, родившийся из желания восполнить недостающую функциональность distutils и исследовать новые направления. В некоторых сообществах это де-факто стандарт. Он использует патчи обезьян и магию, которую не одобряют разработчики ядра Python.
Распространение - это форк Setuptools, который был запущен разработчиками, которые чувствовали, что темп его разработки был слишком медленным и что его было невозможно развить. Его развитие значительно замедлилось, когда distutils2 был запущен той же группой. Обновление 2013-август: дистрибутив снова объединен с setuptools и прекращен.
Distutils2 - это новая библиотека distutils, созданная как форк базы кода distutils, с хорошими идеями, взятыми из инструментов установки (некоторые из которых подробно обсуждались в PEP), и базовым установщиком, вдохновленным pip.
Фактическое имя, которое вы используете для импорта Distutils2, находитсяDistutils2 не сделал релиз Python 3.3, и он был отложен.packaging
в стандартной библиотеке Python 3.3+ илиdistutils2
в версиях 2.4+ и 3.1–3.2. (Бэкпорт будет доступен в ближайшее время.)Больше информации:
Я надеюсь закончить свое руководство в ближайшее время, оно будет содержать больше информации о сильных и слабых сторонах каждой библиотеки и руководство по переходу.
источник
share
кнопки).distribute
был недавно добавлен обратноsetuptools
. Тот факт, что большая часть информации там устарела, добавляет путаницыПРИМЕЧАНИЕ. Ответ устарел. Распространение устарело. Этот ответ больше не действителен с момента создания Python Packaging Authority и проделал большую работу по его устранению.
Да, вы поняли. : -о я думаю, что в настоящее время предпочтительным пакетом является Distribute , который является форком setuptools, который является расширением distutils (оригинальная система упаковки). Setuptools не поддерживается, поэтому он разветвляется и переименовывается, однако при установке он использует имя пакета setuptools! Я думаю, что большинство разработчиков Python сейчас используют Distribute, и я могу точно сказать, что я использую.
источник
Я понимаю, что ответил на ваш второстепенный вопрос, не обращаясь к несомненным предположениям в вашей первоначальной проблеме:
Вы можете , не нужно . Другие стратегии описаны на http://docs.python.org/dev/howto/pyporting
Вы можете :) distutils поддерживает преобразование 2to3 во время сборки для кода (не для строк документации) другим способом, который распространяет: http://docs.python.org/dev/howto/pyporting#during-installation
источник
Обновление этого вопроса в конце 2014 года, когда, к счастью, хаос упаковки Python был значительно очищен менеджером пакетов " conda " из Continuum .
В частности, 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 имеет следующие особенности:
Этот последний пункт особенно важен, если вы находитесь в сфере научных вычислений.
источник