Перетащите вперед установленные пакеты Python при обновлении
Как человек, который запускает несколько веб-серверов, на каждом из которых работает набор сайтов Django, очень важно поддерживать мой стек Python. Из-за (вероятно, плохой) привычки я полагаюсь на Ubuntu для ряда моих пакетов Python, включая python-django
и много python-django-*
дополнительные услуги. Веб-сайты требуют, чтобы они запускались, но пока пакет существует, это не проблема. Я делаю это вместо того, чтобы использовать VirtualEnv (и др.), Потому что я хочу, чтобы Ubuntu устанавливал обновления безопасности.
Однако репозитории Ubuntu не предназначены для всех. Есть случаи, когда я буду использовать pip
или же easy_install
засосать в последнюю версию пакета Python. Когда вы обновляете Python (как это иногда бывает в Ubuntu), вы теряете все свои pip
-установленные пакеты.
Меня пугает то, что чем глубже я получаю, тем больше серверов я администрирую, и однажды произойдет обновление ОС, которое потребует часов и часов моего бега, тестирования сайтов, переустановки пакетов python через pip
, Хуже всего это потенциальное время простоя для клиентских сайтов, хотя я тестирую на своей машине для разработки (всегда на Ubuntu-последней), так что это должно компенсировать некоторые из этих опасений.
Могу ли я что-нибудь сделать, чтобы обновления Python означали, что существующие, не dpgk'd пакеты Python будут перенесены?
Это позволило бы мне всегда иметь доступ к одним и тем же пакетам. Я все еще должен проверить на несовместимость, но это было бы хорошим началом.
Возможно, есть одно лучшее решение: приложение, которое ведет себя как apt
а также dpkg
но для взаимодействия с PyPi (где pip
а также easy_install
получить большую часть их моджо). То, что хранит локальный список установленных пакетов, проверяется на наличие обновлений, таких как apt
, управляемая установка и т. д. Существует ли такая вещь? Или это мусорная идея?
2 ответа
Относительно того, как сохранить ваши пакеты Python при обновлении системы Python: я вижу два варианта:
Вы можете установить не-Ubuntu Python с помощью
easy_install --install-dir /usr/local/python
Затем вы убедитесь, что все ваши веб-приложения включают этот каталог вsys.path
например, включив его в PYTHONPATH, или используя каталог, который автоматически включаетсяsite.py
(чей документ гласит, что "Местные аддоны идут в/usr/local/lib/python<version>/dist-packages
")Вы можете использовать virtualenvs при условии, что вы можете поместить все данные и конфигурацию вашего приложения в каталог, независимый от кода. Вот процедура эскиза:
а. Поместите все независимые от кода вещи в каталог
myapp-data/
б. Создать virtualenv
myapp-code.XXX/
(гдеXXX
это некоторый уникальный номер версии, например,date -I
)с. Поместите код приложения и все пакеты зависимостей в
myapp-code.XXX
д.
ln -s myapp-code.XXX myapp-code
Когда вам нужно обновить, вы просто повторите шаги б. и с. с другим кодом ревизии YYY, затем: остановите запущенное приложение, символическая ссылка
myapp-code
вmyapp-code.YYY
, запустите приложение из virtualenvmyapp-code.YYY
, Если что-то пойдет не так, вы все равно сможете быстро вернуться к старому virtualenv.
Видимо, 2. больше работы (но pip
Кроме того, некоторые сценарии оболочки позволят вам проделать долгий путь к автоматизации), но они также должны быть более надежными и позволять вам одновременно запускать приложения, которые зависят от разных версий некоторых пакетов Python.
Относительно вашего вопроса о apt-get
-подходит для пакетов Python:pip
явно запрещает такую вещь, и на то есть веская причина: API и поведение пакетов могут меняться в разных версиях. Поэтому, если ваш код работает нормально с версией X, он может завершиться ошибкой при запуске с версией X+1. Это именно то, что pip
пытается предотвратить с помощью функций "заморозка" и "список требований".
Конечно, тот же аргумент может быть применен к любой программе в бинарном дистрибутиве, например, в Ubuntu; действительно, что делает apt-get
полезно то, что Debian и Ubuntu обеспечивают скоординированный выпуск совместимых пакетов: сопровождающие прилагают много усилий для обеспечения совместимости всех пакетов Ubuntu в основных репозиториях.
Такого скоординированного выпуска пакетов Python просто нет: каждый пакет является независимым, и нет никакой информации о том, какая версия других пакетов Python совместима с ним. (Это может быть хорошим дополнением к метаданным PyPI.)
Я бы использовал систему управления конфигурацией, такую как puppet или chef, чтобы запускать сценарии на всех серверах, чтобы синхронизировать их все. Ваши сценарии (рецепты) могут управлять обновлением, включая автоматическое тестирование, если обновление прошло успешно или что-то сломалось.