Как распространять и развертывать код Python 3 с изоляцией зависимостей

Меня не устраивает способ, которым я в настоящее время развертываю код Python, и мне было интересно, есть ли лучший способ. Сначала объясню что делаю, потом недостатки:

  • Когда я разрабатываю, я использую virtualenv для изоляции зависимостей и установки всех библиотек с помощью pip. Сам Python исходит из моей ОС (Ubuntu)
  • Затем я встраиваю свой код в пакет debian «.deb», состоящий из моего исходного дерева и пакета моих зависимостей.
  • Затем, когда я развертываю, я перестраиваю среду virtualenv, загружаю foo/bin/activate и затем запускаю свою программу (под выскочкой Ubuntu)

Вот проблемы:

  1. Пакет pip довольно большой и значительно увеличивает размер пакета Debian. Это не так уж важно, но это раздражает.
  2. Мне нужно собирать все библиотеки C (PyMongo, BCrypt и т. д.) каждый раз, когда я развертываю. Это занимает некоторое время (несколько минут), и немного неудобно выполнять эту работу, связанную с ЦП, на производстве.

Вот мои ограничения:

  1. Должен работать на Python 3. Предпочтительно 3.2
  2. Должна быть изоляция зависимостей
  3. Должен работать с библиотеками, использующими C (например, PyMongo).

Я слышал кое-что о замораживании, но я не смог заставить это работать. cx_freeze из Pypi, похоже, не компилируется (по крайней мере, на моем Python). Другие утилиты замораживания, похоже, не работают с Python 3. Как я могу сделать это лучше?


person Cal Paterson    schedule 27.11.2012    source источник


Ответы (2)


Колесо, вероятно, лучший способ сделать это на данный момент.

Создайте виртуальную среду на машине развертывания и разверните колесо вместе со всеми зависимостями (также построенными как колеса) для этого виртуального окружения.

Это решает проблемы:

  1. Наличие отдельных колес для зависимостей означает, что вам не нужно повторно развертывать зависимости, которые не изменились, что сокращает размер артефакта развертывания.
  2. Сборка больших пакетов (таких как lxml или scipy) может выполняться локально, а затем скомпилированное колесо отправляется в производство.

Кроме того, он отлично работает с библиотеками, использующими C.

person Cal Paterson    schedule 01.06.2013

Вы смотрели сборку (zc.buildout)? С помощью пользовательского рецепта вы сможете автоматизировать большую часть этого.

person sureshvv    schedule 02.12.2012
comment
Это автоматизировано — автоматизация не моя проблема. Моя проблема в том, что он медленный и требует компиляции на производстве - person Cal Paterson; 04.12.2012
comment
Вы смотрели дистрибутив колеса? - person sureshvv; 04.12.2012
comment
Колесо теперь находится в точке, где это полезно для такого рода проблем. - person Cal Paterson; 02.06.2013