python install - Atualizando todos os pacotes com pip




15 Answers

Ainda não há uma bandeira incorporada, mas você pode usar

pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

Nota: existem infinitas variações potenciais para isso. Estou tentando manter esta resposta curta e simples, mas sugiro variações nos comentários!

Na versão mais antiga do pip , você pode usar isso:

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

O grep é pular as definições de pacotes editáveis ​​("-e"), como sugerido por @jawache. (Sim, você poderia substituir grep + cut por sed ou awk ou perl ou ...).

O sinalizador -n1 para xargs evita parar tudo se a atualização de um pacote falhar (obrigado @andsens ).

windows mac

É 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.




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 .




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



O seguinte one-liner pode ser útil:

pip list --format freeze --outdated | sed 's/(.*//g' | xargs -n1 pip install -U

xargs -n1 continua se ocorrer um erro.

Se você precisar de mais controle "refinado" sobre o que é omitido e o que gera um erro, você não deve adicionar o sinalizador -n1 e definir explicitamente os erros a serem ignorados, "canalizando" a seguinte linha para cada erro separado:

| sed 's/^<First characters of the error>.*//'

Aqui está um exemplo de trabalho:

pip list --format freeze --outdated | sed 's/(.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U



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




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.




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.




Solução Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --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



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).




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.



E se:

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



O mais curto e fácil no Windows.

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



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:




Related

python pip

Tags

python   pip