Python: управление пакетами

В самом начале управление пакетами в Python может показаться несколько запутанным. Но только на первый взгляд.

Существует несколько различных форматов, библиотек и утилит для распространения Python пакетов. Кроме этого, существует PyPI –индекс пакетов Python, репозиторий программного обеспечения для Python.

Наиболее часто используемые форматы: тарболлы (tar.gz или zip файлы), eggs и системные пакеты (rpm, deb и другие). Тарболлы это обычные архивы с исходным кодов. rpm и deb файлы – это бинарные файлы, собранные при помощи системных утилит, например, rpmbuild. Eggs можно рассматривать как zip архивы с мета-информацией (например, о зависимостях).

Кроме этого, существуют различные библиотекиdistutils, setuptools, distribute и  zc.buildout.

distutils

Стандартная библиотека. Для распространения пакета разработчик должен написать простой setup.py скрипт, который будет использоваться для сборки пакета в различных форматах. Часть функционала в библиотеке отсутствует, однако она понятная и простая в использовании.

Пример setup.py:

from distutils.core import setup
setup(name='foo',
version='1.0',
py_modules=['foo'],
)

Сборка rpm:

python setup.py bdist_rpm

setuptools

Программное обеспечение сторонних разработчиков, основанное на distutils. Библиотека setuptools была создана для того, чтобы сделать сборку пакетов в Python более гибкой, чем это было возможно с использованием  distutils (например, по работе с зависимостями).

Пример setup.py:
from setuptools import setup, find_packages
setup(
name = "HelloWorld",
version = "0.1",
packages = find_packages(),
)

Так же как и distutils,  setuptools поддерживает несколько форматов (bdist_rpm, bdist_wininst и  др.). В течение долгого времени setuptools была широка распространена. Например, redis-py Andy McCurdy использует setuptools, равно как и  многие другие разработчики.

distribute

Эта библиотека тоже является сторонним программным обеспечение и представляет собой fork setuptools. distribute была создана после того, как  разработка  и поддержка setuptools были фактически остановлены в течение длительного времени. Основная цель distribute ‘заменить setuptools в качестве стандартного способа работы с пакетами ‘. Поддерживает обе версии Python – 2 и 3. Разрабатывается в двух ветках: 0.6.x (обеспечивает совместимость с  setuptools-0.6cX, а так же содержит исправление многих ошибок, которые не были исправлены в setuptools)  и 0.7.x (будет полностью переработанной версией с большим количеством  изменений).

zc.buildbot

Проект был  создан Jim Fulton в 2006 году и основан на использовании setuptools and easy_install. Возможно, более сложный, чем другие, но и более амбициозный проект.

Buildbot использует дополнительные конфигурационные файлы (например, boostrap.py, bootstrap.cfg). Разработан на Python и предназначен для работы с eggs. Buildbot вводит концепцию  recipes – плугинов, которые позволяют добавлять дополнительный функционал при сборке пактов, как это описано в официальной документации.  Recipes  могут быть установлены из PyPI.  Это позволяет zc.buildbot значительно расширять возможности, поскольку recipes могут быть использованы для самых разных целей, например,  установки Apache, управления заданиями Cron и других. Возможно также использование  pip с buildbot.

Кроме того, существует несколько утилит для работы с пакетами:  easy_install и pip.

easy_install

Входит в состав setuptools и представляет собой пакетный менеджер. Простая в использовании утилита. Позволяет загружать, собирать и управлять Python пакетами. Кроме того, может быть использована для установки пакетов в eggs формате, а также пакетов из PyPI. Утилита была основным способом работы со сторонними пакетами до того, как был разработан pip. Один из основных недостатков – невозможность удаления пакетов.  easy_install будет объявлена устаревшей в distribute версии 0.7.x.

Пример использования easy_install:

easy_install install foobar

pip

Утилита для управления пакетами, созданная Ian Bicking. Используется, в основном, для установки и управления пакетами из PyPI. Предназначена для замены easy_install и содержит дополнительные возможности (например, позволяет удалять пакеты) . Не умеет устанавливать пакеты в формате eggs, но, судя по всему, это не проблема. Использует setuptools или distribute. pip будет автоматически установлен при создании виртуального окружения с помощью virtualenv.

Пример использования pip:

pip install foobar

Еще одна важная утилита, о которой необходимо знать, это virtualenv. Утилита широко используется для создания изолированного окружения,  и может быть полезна как в  production, так и при разработке.

На момент написания (август 2011) , наиболее предпочтительный способ инсталляции пакетов  – это pip, и библиотека distribute – для сборки пакетов.  easy_install и setuptools могут рассматриваться как устаревшие.

Теперь вы можете легко понять, что имел в виду один из создателей Django Jacob Kaplan-Moss:

В Python существует один способ распространения пакетов: исходные файлы и setup.py.
И easy_install.
В Python существует два способа распространения пакетов: setup.py install и easy_install. И zc.buildout.
В Python существует три способа распространения пакетов: setup.py install, easy_install и zc.buildout. И pip.
Из всех способов распространения пакетов в Python можно выделить, такие как …

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

  1. On packaging, Why I like pip, both by James Bennett, Django release manager
  2. Chapter 16. Packaging Python Libraries from Dive Into Python 3 by Mark Pilgrim
  3. A small introduction to Python Eggs by by Christian Scholz
  4. Python Packaging, Distribution, and Deployment: Volume 1
  5. A Few Corrections To “On Packaging” by Ian Bicking
  6. A history of Python packaging by Martijn Faassen
  7. Developing Django apps with zc.buildout by Jacob Kaplan-Moss
  8. Chapter 14. Python Packaging by Tarek Ziadé

Добавить комментарий

Ваш e-mail не будет опубликован.