python tutorial Atualizando todos os pacotes com pip




repositorio python pip (20)

É possível atualizar todos os pacotes do Python de uma só vez com o pip ?

Observe que há uma solicitação de recurso para isso no rastreador de problemas oficial.

https://code.i-harness.com


A gema bastante surpreendente torna isso fácil.

pip install yolk3k # don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade

Para mais informações sobre o yolk: https://pypi.python.org/pypi/yolk/0.4.3

Pode fazer muitas coisas que você provavelmente achará úteis.



Ao usar um virtualenv e se você quiser apenas atualizar pacotes adicionados ao seu virtualenv, você pode querer fazer:

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade

Aqui está minha variação na resposta da rbp, que ignora distribuições "editáveis" e de desenvolvimento. Ele compartilha duas falhas do original: faz um novo download e reinstala desnecessariamente; e um erro em um pacote impedirá a atualização de todos os pacotes depois disso.

pip freeze |sed -ne 's/==.*//p' |xargs pip install -U --

Relatórios de bugs relacionados, um pouco desarticulados após a migração do bitbucket:


E se:

pip install -r <(pip freeze) --upgrade

Enviado através de um pedido de pull para o folk pip ; Enquanto isso, use essa solução de biblioteca pip que escrevi:

from pip import get_installed_distributions
from pip.commands import install

install_cmd = install.InstallCommand()

options, args = install_cmd.parse_args([package.project_name
                                        for package in
                                        get_installed_distributions()])

options.upgrade = True
install_cmd.run(options, args)  # Chuck this in a try/except and print as wanted

Eu tentei o código de Ramana e descobri que no Ubuntu você tem que escrever sudo para cada comando. Aqui está o meu script que funciona bem no Ubuntu 13.10:

#!/usr/bin/env python
import pip
from subprocess import call

for dist in pip.get_installed_distributions():
    call("sudo pip install --upgrade " + dist.project_name, shell=True)

Eu tive o mesmo problema com a atualização. A coisa é, eu nunca atualizo todos os pacotes. Eu atualizo apenas o que eu preciso, porque o projeto pode quebrar.

Como não havia uma maneira fácil de atualizar pacote por pacote e atualizar o arquivo requirements.txt, eu escrevi este atualizador de pip-upgrader que também atualiza as versões em seu arquivo requirements.txt para os pacotes escolhidos (ou todos os pacotes).

Instalação

pip install pip-upgrader

Uso

Ative seu virtualenv (importante, porque ele também instalará as novas versões dos pacotes atualizados no virtualenv atual).

cd no diretório do seu projeto e execute:

pip-upgrade

Uso avançado

Se os requisitos forem colocados em um local não padrão, envie-os como argumentos:

pip-upgrade path/to/requirements.txt

Se você já sabe qual pacote deseja atualizar, basta enviá-los como argumentos:

pip-upgrade -p django -p celery -p dateutil

Se você precisar atualizar para a versão de pré-lançamento / pós-lançamento, adicione o argumento --prerelease ao seu comando.

Divulgação completa: eu escrevi este pacote.


Isso não é mais eficaz?

pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U 
  1. pip list -o lista os pacotes desatualizados;
  2. grep -v -i warning jogo invertido no warning para evitar erros ao atualizar
  3. cut -f1 -d1' ' retorna a primeira palavra - o nome do pacote desatualizado;
  4. tr "\n|\r" " " converte o resultado de cut linhas de cut em uma lista separada por espaço de linha única;
  5. awk '{if(NR>=3)print}' pula as linhas de cabeçalho
  6. cut -d' ' -f1 busca a primeira coluna
  7. xargs -n1 pip install -U recebe 1 argumento do pipe restante dele e passa para o comando para atualizar a lista de pacotes.

Isso parece mais conciso.

pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U

Explicação:

pip list --outdated obtém linhas como estas

urllib3 (1.7.1) - Latest: 1.15.1 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]

Em cut -d ' ' -f1 , -d ' ' define "espaço" como delimitador, -f1 significa obter a primeira coluna.

Então as linhas acima se tornam:

urllib3
wheel

em seguida, passá-los para xargs para executar o comando, pip install -U , com cada linha como argumentos anexados

-n1 limita o número de argumentos passados ​​para cada comando pip install -U para ser 1


Meu script:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade

O mais curto e fácil no Windows.

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt

Para atualizar todos os pacotes locais; você poderia usar pip-review :

$ pip install pip-review
$ pip-review --local --interactive

pip-review é um fork das pip-tools . Veja o problema do pip-tools mencionado por @knedlsepp . pip-review pacote pip-review funciona, mas o pacote pip-tools não funciona mais.

pip-review funciona no Windows desde a versão 0.5 .


Solução Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}

Versão do Windows depois de consultar uma excelente documentation para FOR por Rob van der Woude

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i

Você pode apenas imprimir os pacotes que estão desatualizados

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

Você pode usar o seguinte código Python. Ao contrário do pip freeze , isso não imprimirá avisos e erros do FIXME. Para pip <10.0.1

import pip
from subprocess import call

packages = [dist.project_name for dist in pip.get_installed_distributions()]
call("pip install --upgrade " + ' '.join(packages), shell=True)

Para pip> = 10.0.1

import pkg_resources
from subprocess import call

packages = [dist.project_name for dist in pkg_resources.working_set]
call("pip install --upgrade " + ' '.join(packages), shell=True)

uma linha no powershell 5.1 com direitos adm, python 3.6.5 e pip ver 10.0.1:

pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}

funciona sem problemas se não houver pacotes quebrados ou rodas especiais na lista ...


Solução mais robusta

Para pip3 use isto:

pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh

Para pip, basta remover os 3s como tal:

pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh

Oddity OSX

A OSX, a partir de julho de 2017, vem com uma versão muito antiga do sed (uma dúzia de anos). Para obter expressões regulares estendidas, use -E em vez de -r na solução acima.

Resolvendo problemas com soluções populares

Esta solução é bem projetada e testada 1 , enquanto há problemas até com as soluções mais populares.

  • Problemas de portabilidade devido a alterações nos recursos da linha de comando do pip
  • Colisão de xargs porque falhas comuns de processo filho pip ou pip3
  • Log movimentado da saída de xargs brutos
  • Baseando-se em uma ponte Python-para-OS, enquanto potencialmente atualizando-o 3

O comando acima usa a sintaxe pip mais simples e mais portátil em combinação com sed e sh para superar esses problemas completamente. Detalhes da operação sed podem ser examinados com a versão comentada 2 .

Detalhes

[1] Testado e usado regularmente em um cluster Linux 4.8.16-200.fc24.x86_64 e testado em cinco outros tipos de Linux / Unix. Ele também é executado no Cygwin64 instalado no Windows 10. O teste no iOS é necessário.

[2] Para ver a anatomia do comando mais claramente, este é o equivalente exato do comando pip3 acima com comentários:

# match lines from pip's local package list output
# that meet the following three criteria and pass the
# package name to the replacement string in group 1.
# (a) Do not start with invalid characters
# (b) Follow the rule of no white space in the package names
# (c) Immediately follow the package name with an equal sign
sed="s/^([^=# \t\\][^ \t=]*)=.*"

# separate the output of package upgrades with a blank line
sed="$sed/echo"

# indicate what package is being processed
sed="$sed; echo Processing \1 ..."

# perform the upgrade using just the valid package name
sed="$sed; pip3 install -U \1"

# output the commands
sed="$sed/p"

# stream edit the list as above
# and pass the commands to a shell
pip3 freeze --local |sed -rn "$sed" |sh

[3] A atualização de um componente Python ou PIP que também é usado na atualização de um componente Python ou PIP pode ser uma possível causa de uma corrupção no banco de dados de deadlock ou pacote.


A resposta do @Ramana funcionou melhor para mim, daqueles aqui, mas eu tive que adicionar algumas capturas:

import pip
for dist in pip.get_installed_distributions():
    if 'site-packages' in dist.location:
        try:
            pip.call_subprocess(['pip', 'install', '-U', dist.key])
        except Exception, exc:
            print exc

A verificação de site-packages exclui meus pacotes de desenvolvimento, porque eles não estão localizados no diretório system-packages do sistema. O try-except simplesmente ignora os pacotes que foram removidos do PyPI.

@endolith: Eu estava esperando por um pip.install(dist.key, upgrade=True) fácil pip.install(dist.key, upgrade=True) também, mas não parece que pip foi feito para ser usado por qualquer coisa que não seja a linha de comando (os documentos não mencionam API interna e os desenvolvedores pip não usaram docstrings).







pip