Перетащите вперед установленные пакеты Python при обновлении

Как человек, который запускает несколько веб-серверов, на каждом из которых работает набор сайтов Django, очень важно поддерживать мой стек Python. Из-за (вероятно, плохой) привычки я полагаюсь на Ubuntu для ряда моих пакетов Python, включая python-django и множество python-django-* дополнений. Веб-сайты требуют, чтобы они запускались, но пока пакет существует, это не проблема. Я делаю это вместо того, чтобы использовать VirtualEnv (и др.), Потому что я хочу, чтобы Ubuntu установила обновления безопасности.

Однако репозитории Ubuntu предназначены не для всех. В некоторых случаях я буду использовать pip или easy_install, чтобы засосать последнюю версию пакета Python. Когда вы обновляете Python (как это иногда бывает в Ubuntu), вы теряете все ваши pip -установленные пакеты.

Меня пугает то, что чем глубже я получаю, тем больше серверов я администрирую, и в один прекрасный день произойдет обновление ОС, которое потребует часов и часов моего бега вокруг, тестирования сайтов, переустановки пакетов python через pip. Хуже всего это потенциальное время простоя для клиентских сайтов, хотя я тестирую на своей машине для разработки (всегда в Ubuntu-latest), поэтому это должно компенсировать некоторые из этих опасений.

Могу ли я что-нибудь сделать, чтобы обновления Python означали, что существующие, не dpgk'd пакеты Python были перенесены?

Это позволило бы мне всегда иметь доступ к тем же пакетам. Я все еще должен был бы проверить на несовместимость, но это было бы хорошим началом.

Возможно, есть еще одно лучшее решение: приложение, которое ведет себя как apt и dpkg, но для взаимодействия с PyPi (где pip и easy_install получают большую часть своего mojo)). Что-то, что хранит локальный список установленных пакетов, проверяется наличие обновлений, таких как apt, управляемая установка и т. Д. Существует ли такая вещь? Или это чепуха?

5
задан 29 September 2010 в 16:45

2 ответа

Относительно того, как сохранить ваши пакеты Python при обновлении системы Python: я вижу две опции:

  1. Вы можете установить не-Ubuntu Python с помощью easy_install --install-dir /usr/local/python. Тогда вы убедитесь, что что все ваши веб-приложения включают этот каталог в sys.path, например, включив его в PYTHONPATH, или используя каталог, который автоматически включается в site.py (документ которого гласит, что «Локальные дополнения входят в /usr/local/lib/python<version>/dist-packages»)

  2. Вы можете использовать virtualenvs, при условии, что вы можете поместить все данные и конфигурацию вашего приложения в каталог, независимый от кода. Вот процедура эскиза:

    a. Поместите все независимые от кода вещи в каталог myapp-data/

    b. Создать virtualenv myapp-code.XXX/ (где XXX - некоторый уникальный номер версии, например, date -I)

    c. Поместите код приложения и все пакеты зависимостей в myapp-code.XXX

    d. ln -s myapp-code.XXX myapp-code

    Когда вам нужно обновить, просто повторите шаги б. и с. с другим кодом ревизии YYY, затем: остановите запущенное приложение, символическую ссылку myapp-code - myapp-code.YYY, запустите app из virtualenv myapp-code.YYY. Если что-то пойдет не так, вы все равно сможете быстро вернуться к старому virtualenv.

По-видимому, 2. это больше работы (но pip плюс некоторые сценарии оболочки помогут вам проделать долгий путь к автоматизации), но это также должно быть более надежным и позволит вам одновременно запускать приложения, которые зависит от разных версий некоторых пакетов Python.

Относительно вашего вопроса о apt-get -подобном для пакетов Python: pip явно запрещает такую ​​вещь, и на то есть веская причина: API и поведение пакетов могут изменяться в разных версиях. Поэтому, если ваш код работает нормально с версией X, он может завершиться ошибкой при запуске с версией X + 1. Это именно то, что pip пытается предотвратить с помощью функций «замораживания» и «списка требований».

Конечно, тот же аргумент может быть применен к любой программе в бинарном дистрибутиве, например Ubuntu; действительно, то, что делает apt-get полезным, заключается в том, что Debian и Ubuntu обеспечивают скоординированный выпуск совместимых пакетов: сопровождающие прилагают много усилий для обеспечения совместимости всех пакетов Ubuntu в основных репозиториях.

Такого скоординированного выпуска пакетов Python просто не существует: каждый пакет независим и нет информации о том, какая версия других пакетов Python совместима с ним. (Это может быть хорошим дополнением к метаданным PyPI.)

0
ответ дан 29 September 2010 в 16:45

Я бы использовал систему управления конфигурацией, такую ​​как puppet или chef , чтобы запускать скрипты на всех серверах, чтобы поддерживать их синхронизацию. Ваши сценарии (рецепты) могут управлять обновлением, включая автоматическое тестирование, если обновление прошло успешно или что-то сломалось.

0
ответ дан 29 September 2010 в 16:45

Другие вопросы по тегам:

Похожие вопросы: