Перетащите вперед установленные пакеты 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: я вижу два варианта:

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

  2. Вы можете использовать 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, чтобы запускать сценарии на всех серверах, чтобы синхронизировать их все. Ваши сценарии (рецепты) могут управлять обновлением, включая автоматическое тестирование, если обновление прошло успешно или что-то сломалось.

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