Разработка и развертывание кода Python значительно упрощены благодаря setuptools в сочетании с virtualenv и pip .
Основные идеи
Самая хитрая часть, которую я обнаружил, - это запуск среды разработки, которая максимально точно отражает развернутую установку, в то же время соблюдая инструменты и идиомы Pythonic.Но оказывается, что этого очень легко достичь с помощью pip и setuptools, которые вместе позволяют вам «устанавливать» дерево разработки в среду Python, не перемещая файлы.(На самом деле setuptools делает все это сам по себе, но pip лучше действует как зависимости дескриптора внешнего интерфейса.)
Еще одна ключевая проблема - подготовка чистой среды с известным набором пакетов в обеих средах.Virtualenv Python - это хорошая посылка в этом отношении, позволяющая вам настраивать полностью настроенную среду Python с вашим собственным выбором пакетов, не требуя root-доступа, или пакетов ОС (rpm или dpkg), и не будучи ограниченным какими-либо пакетами и версиями.из них, которые установлены в вашем дистрибутиве.
Наконец, один неприятный медведь ошибок - это сложность создания сценариев командной строки, которые хорошо работают с PYTHON_PATH.Это также довольно элегантно решается с помощью setuptools.
Настройка
(Для простоты это довольно предписательно. Не стесняйтесь расходиться по мере необходимости.)
- Подготовьте рабочий каталог, который ваши Python-компоненты могут назвать домом.
- Возьмите последнюю версию virtualenv из нижней части этой страницы и распакуйте ее (не важно где).
Из рабочего каталога настройте новую виртуальную среду Python:
$ python <untarred_directory>/virtualenv.py venv
Вы захотите выполнять большую часть своей работы изнутри этой виртуальной среды.Используйте эту команду для этого (.
является ярлыком для source
):
$ . venv/bin/activate
Установочный пункт:
$ easy_install pip
Создание каталогов для каждого устанавливаемого пакета, который вы хотите создать.
- В каждом каталоге вам понадобится файл setup.py, который определяет содержимое и структуру пакета.Setuptools документация - очень хороший ресурс для начала работы с этим.Стоит потратить время на поглощение больших кусков.
Разработка
Как только ваша древовидная структура готова, вы почти готовы начать кодирование.Но прямо сейчас пакеты, которые зависят друг от друга, не могут видеть друг друга, как в развернутой среде.Эта проблема решена с помощью небольшого хитрого трюка, который предлагает setuptools и который использует pip.Для каждого разрабатываемого пакета выполните следующую команду (убедитесь, что вы находитесь в виртуальной среде для своего проекта, как описано в шаге 3 выше):
$ pip install -e pkg1
Эта команда установит pkg1
в вашвиртуальная среда, и это делает это без копирования любых ваших файлов.Он просто добавляет ссылку на каталог site-packages
, указывающую на корень разработки пакета, и создает в этом корне каталог egg-info.Вы также можете сделать это без пипа, как показано ниже:
$ cd pkg1
$ python setup.py develop
И это обычно будет работать, но если у вас есть сторонние зависимости (которые должны быть перечислены в setup.py, как объяснено здесь в документации к setuptools), pip умнее в их поиске.
Следует обратить внимание на то, что ни setuptools, ни pip не имеют смысла находить зависимости между вашими собственными пакетами.Если PkgB в каталоге B зависит от PkgA в каталоге A, то pip install -e B
завершится ошибкой, поскольку pip не может узнать, что PkgA находится в каталоге A;вместо этого он попытается и не сможет загрузить PkgA из своих источников в онлайн-хранилище.Обходной путь - просто установить каждый пакет после его зависимостей.
На этом этапе вы можете запустить python, загрузить один из ваших модулей и начать играть с ним.Вы можете редактировать код, и он будет сразу же доступен при следующем импортировании.
Наконец, если вы хотите создавать инструменты командной строки с вашими пакетами. Не пишите их от руки. В результате вы получите ужасный беспорядок PYTHON_PATH-хаков, который никогда не работает должным образом. Просто прочитайте автоматическое создание скрипта в документации к setuptools. Это избавит вас от горя.
Развертывание
Когда ваши пакеты готовы к действию, вы можете использовать setup.py для создания пакетов развертывания. Здесь слишком много вариантов, чтобы начать, но вам стоит начать:
$ cd pkg1
$ python setup.py --help
$ python setup.py --help-commands
Свободные концы
Из-за широкого характера вопроса этот ответ обязательно является неполным. Я не имел дело с долго работающими серверами, веб-платформами или самим процессом развертывания (в частности, с использованием pip install --index-url
для управления частным хранилищем сторонних и внутренних пакетов и -e vcs+...
, который будет пакеты из svn, git, hg или bzr). Но я надеюсь, что дал вам достаточно веревки, чтобы связать все это вместе (только не вешайте себя на это: -).