Подтвердить что ты не робот

State of Python Packaging: Buildout, Distribute, Distutils, EasyInstall и т.д.

В последний раз, когда мне приходилось беспокоиться об установке пакетов Python, было два года назад, работая с Enthought, NumPy и MayaVi2. Этот опыт дал мне затяжные кошмары, связанные с причудливым поведением, устанавливающим и обновляющим пакеты Python в нестандартных местах (например, в $HOME/usr/local2.6/).

В любом случае, моя работа возвращает меня к установке различных пакетов Python. CheeseShop Tutorial упоминает DistUtils и EasyInstall в дополнение к Buildout! Мне трудно найти одно место, сравнивающее эти (и другие) инструменты установки PyPi, поэтому я надеюсь использовать сообщество StackOverflow: Каковы сильные и слабые стороны каждого инструмента установки?

4b9b3361

Ответ 1

Прежде всего, независимо от инструмента установки, который вы решаете, начните использовать virtualenv --no-site-packages! Таким образом, пакеты python не устанавливаются глобально, и вы можете легко вернуться к тому, где были старые и новые проекты.

Теперь ваше сравнение - это немного яблоки для груши, поскольку перечисленные вами инструменты не являются взаимоисключающими. Тем не менее, я могу полностью рекомендовать Buildout. Он установит пакеты python, а также другие материалы и позволит вам автоматизировать установку и развертывание (сложных) проектов.

Кроме того, я рекомендую изучить Fabric как средство автоматизации административных задач.

Ответ 3

Я сделал несколько исследований по этой теме (за пару недель), прежде чем приступить к использованию buildout для всех моих проектов.

DistUtils и EasyInstall в дополнение к Buildout!

Трудность создания одного места для сравнения всех этих инструментов заключается в том, что они все являются частью одной и той же цепочки инструментов и используются вместе для создания предсказуемого, надежного и гибкого набора инструментов.

Например, easy_install используется для установки пакетов distutils из pypi (cheeseshop) в каталог Python site-packages. Это значительно упрощает установку пакетов на ваш системный/глобальный sys.path.

easy_install очень удобна для пакетов, которые совместимы для всех проектов. Но я считаю, что я предпочитаю использовать system easy_install для установки пакетов, от которых проекты не зависят. Например, github-cli Я использую с каждым проектом, потому что он позволяет мне взаимодействовать с проблемами проекта Github из командной строки. Я использую это с проектами, но это для удобства, и сам проект не имеет зависимости от этого пакета.

Для управления зависимостями проектов я использую buildout. Buildout позволяет вам конкретно указать, из какой версии пакетов зависит ваш проект. Я предпочитаю buildout over pip-requirements.txt, потому что buildout является декларативным. С помощью pip вы устанавливаете пакеты, и в конце разработки вы создаете файл requirements.txt. С помощью Buildout, с другой стороны, вы изменяете buildout.cfg перед тем, как яйцо пакета добавляется в ваш проект. Это заставляет меня осознавать, какие пакеты я добавляю в проект.

Теперь существует вопрос о virtualenv. Одной из наиболее популярных функций virtualenv является, очевидно, опция -no-site-packages. Я не нашел этот вариант особенно полезным, потому что я использую buildout. Buildout управляет sys.path и включает только те пакеты, которые я прошу, чтобы он включал. Он также включает все в системные пакеты Python, но поскольку у меня нет ничего, что я использую в проектах, у меня никогда не было конфликтов.

Кроме того, я обнаружил, что -no-site-пакеты только мешают моему процессу разработки, потому что некоторые пакеты, которые я устанавливаю, используют мою систему упаковки sistem. Обычно, все, что имеет библиотеки C, которые необходимо скомпилировать, я устанавливаю через систему системной упаковки.

В проекте fabfile.py я включаю тестовую функцию для проверки наличия системных пакетов, которые устанавливаю через диспетчера системных пакетов.

Вкратце, вот как я использую эти инструменты:

Диспетчер системных пакетов (apt-get, yam, port, fink...) Я использую один из них для установки версий python, которые мне нужны в этой системе. Я также использую его для установки пакетов, таких как lxml, которые включают библиотеки c.

easy_install Я использую для установки пакетов из pypi, которые я использую для всех проектов, но проекты не зависят от этих пакетов.

Buildout Я использую для управления зависимостями проекта.

По моему опыту, этот рабочий процесс был очень гибким, портативным и легким в работе.

Ответ 5

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

Например, если вам нужно установить пакеты python на компьютерах Gentoo (GNU/Liunx), вы можете легко использовать g-pypi, чтобы создать ebuild для всех пакетов, которые используют distutils (скорее, setup.py). Таким образом, они полностью интегрируются в вашу систему и могут быть добавлены, обновлены и удалены, как и все ваши другие инструменты. Но он, естественно, работает только для систем на основе Gentoo.

Также вы можете использовать yolk, чтобы узнать о всех пакетах, установленных через easy_install в вашей системе (не только в Gentoo).

Когда я пишу код, я просто использую distutils (потому что он очень упрощает создание ebuild portage), а иногда и базовые функции setuptools или организует мои программы, чтобы люди могли просто загрузить и запустить их из папки программы (в идеале просто распаковать источник архивировать/клонировать хранилище где-нибудь). Это не идеальное решение, но пока основная команда python не решит, к какому пути они хотят двигаться, я не хочу исправлять путь (больше), который может исчезнуть.