python install - Atualizando todos os pacotes com pip




windows mac (25)

Você pode tentar isto:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done

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


use pacotes de atualização do awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')


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

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


O mais curto e fácil no Windows.

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

Meu script:

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

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.

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.


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)

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

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

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)

Solução Windows Powershell

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

Funciona no Windows. Deve ser bom para os outros também. ($ é qualquer diretório no qual você esteja, no prompt de comando, por exemplo, C: / Users / Username>)

Faz

$ pip freeze > requirements.txt

abra o arquivo de texto, substitua o == por> =

então faça

$ pip install -r requirements.txt --upgrade

Se você tiver um problema com um certo pacote que está atrasando a atualização (às vezes numpy), vá até o diretório ($), comente o nome (adicione # antes dele) e execute a atualização novamente. Você pode mais tarde descomentar essa seção. Isso também é ótimo para copiar ambientes globais de python.

Eu também gosto do método de revisão pip:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip_review --local --interactive

Você pode selecionar 'a' para atualizar todos os pacotes; se uma atualização falhar, execute-a novamente e continue na próxima.


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


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


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 .


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


E se:

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

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.


Versão de uma linha da resposta de @ Ramana .

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'

`


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.


import pip
pkgs = [p.key for p in pip.get_installed_distributions()]
for pkg in pkgs:
    pip.main(['install', '--upgrade', pkg])

ou mesmo:

import pip
commands = ['install', '--upgrade']
pkgs = commands.extend([p.key for p in pip.get_installed_distributions()])
pip.main(commands)

Funciona rápido, pois não está constantemente lançando um shell. Eu adoraria encontrar tempo para fazer isso realmente usando a lista desatualizada para acelerar ainda mais as coisas.


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

Para evitar ter que baixar esses arquivos, você pode tentar:

pip install --use-wheel pillow

Para mais informações, veja isto .





python pip