Arraste pacotes Python instalados para a frente ao atualizar

5

Como alguém que executa vários servidores web, cada um executando um conjunto de sites do Django, manter-se no topo da minha pilha Python é muito importante. Fora do (provavelmente ruim) hábito, eu confio no Ubuntu para vários dos meus pacotes Python, incluindo python-django e muitos python-django-* extras. Os sites exigem que eles sejam executados, mas enquanto o pacote ainda existir, isso não é um problema. Eu faço isso em vez de usar VirtualEnv (et al) porque eu quero que o Ubuntu instale atualizações de segurança.

No entanto, os repositórios do Ubuntu não servem para todos. Há casos em que usarei pip ou easy_install para sugar a versão mais recente de um pacote Python. Quando você atualiza o Python (como acontece ocasionalmente no Ubuntu), você perde todos os seus pacotes pip -installed.

O que me apavora é que quanto mais fundo eu obtiver, mais servidores eu administro, haverá uma atualização do SO um dia que requer horas e horas do meu tempo correndo, testando sites, reinstalando pacotes python através de pip . A pior parte disso é o tempo de inatividade potencial para sites de clientes, embora eu teste na minha máquina de desenvolvimento (sempre no Ubuntu mais recente), então isso deve compensar parte dessa preocupação.

Existe alguma coisa que eu possa fazer para garantir que as atualizações do Python signifiquem que os pacotes Python não dpgk existentes são apresentados?

Isso garante que eu sempre tenha acesso aos mesmos pacotes. Eu ainda teria que testar incompatibilidades, mas seria um bom começo.

Há talvez uma solução melhor: um aplicativo que se comportou como apt e dpkg , mas interagindo com PyPi ( onde pip e easy_install obtêm a maior parte do seu mojo). Algo que armazenou uma lista local de pacotes instalados, verificou por atualizações como apt , conseguiu instalar, etc. Existe tal coisa? Ou é uma idéia de lixo?

    
por Oli 29.09.2010 / 14:45

2 respostas

3

Sobre como manter seus pacotes Python quando o sistema Python está atualizado: vejo duas opções:

  1. Você pode instalar coisas do Python que não sejam do Ubuntu com easy_install --install-dir /usr/local/python . Então, certifique-se de que todas as suas webapps incluem esse diretório em sys.path , por exemplo, incluindo-o em PYTHONPATH, ou usando um diretório que seja automaticamente incluído por site.py (cujo documento declara que "Local addons entram em /usr/local/lib/python<version>/dist-packages ")

  2. Você pode usar o virtualenvs, desde que possa colocar todos os dados do aplicativo e configuração em um diretório independente do código. Aqui está um procedimento de esboço:

    a. Coloque todo o material independente de código no diretório      myapp-data/

    b. Crie virtualenv myapp-code.XXX/ (onde XXX é algum     número de versão exclusivo, por exemplo, date -I )

    c. Coloque o código do aplicativo e todos os pacotes de dependência em myapp-code.XXX

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

    Quando você precisar fazer upgrade, repita as etapas b. e C. com um código de revisão diferente YYY, então: interrompa o aplicativo em execução no momento, link simbólico myapp-code para myapp-code.YYY , iniciar aplicativo de virtualenv %código%. Se algo der errado, você ainda pode reverter para o velho virtualenv rapidamente.

Aparentemente, 2. é mais trabalho (mas myapp-code.YYY mais algum shell-scripting te levar muito longe para automatizá-lo), mas também deve ser mais robusto e permitirá que você execute simultaneamente aplicativos que dependam em versões diferentes de algum pacote Python.

Com relação à sua pergunta sobre um pacote pip -like for Python: apt-get explicitamente desaprova tal coisa e por um bom motivo: APIs de pacote e comportamento podem mudar em diferentes versões. Portanto, se seu código é executado bem contra a versão X, pode falhar quando executado com a versão X + 1. Isso é exatamente o que o pip tenta evitar com os recursos "congelar" e "lista de requisitos".

Claro, o mesmo argumento pode ser aplicado a qualquer programa em um binário distribuição como o Ubuntu; de fato, o que torna pip útil é que Debian e Ubuntu fornecem um lançamento coordenado de interoperabilidade pacotes: muito esforço dos mantenedores garante que todos os pacotes do Ubuntu nos repositórios principais são compatíveis.

Não há apenas uma versão coordenada de pacotes Python: cada pacote é independente e nenhuma informação está disponível sobre o que versão de outros pacotes Python são compatíveis com ele. (Isso poderia possivelmente seja uma boa adição aos metadados do PyPI.)

    
por Riccardo Murri 29.09.2010 / 17:25
3

Eu usaria um sistema de gerenciamento de configuração como fantoche ou chef para executar scripts em todos os servidores para mantê-los todos em sincronia. Seus scripts (receitas) podem gerenciar a atualização, incluindo o teste automático, se a atualização foi bem-sucedida ou quebrou alguma coisa.

    
por txwikinger 29.09.2010 / 19:25