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

5

Как кто-то, кто управляет несколькими веб-серверами, каждый из которых запускает набор сайтов 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 получают большую часть своего mojo). Что-то, что хранит локальный список установленных пакетов, проверено на наличие обновлений, таких как apt , управляемая установка и т. Д. Есть ли такая вещь? Или это идея мусора?

    
задан Oli 29.09.2010 в 14:45
источник

2 ответа

3

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

  1. Вы можете установить материал не-Ubuntu Python с помощью easy_install --install-dir /usr/local/python . Затем вы убедитесь, что все ваши webapps включают этот каталог в sys.path , например, включая его в PYTHONPATH, или используя каталог, который автоматически включается site.py (в документе указано, что «Local аддоны идут в /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

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

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

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

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

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

    
ответ дан Riccardo Murri 29.09.2010 в 17:25
источник