Como atualizar todos os pacotes Python com pip?

2051

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

Nota : existe uma solicitação de recurso para isso no rastreador oficial de problemas.

thedjpetersen
fonte
37
Cuidado com a podridão do software - atualizar dependências pode danificar seu aplicativo. Você pode listar a versão exata de todos os pacotes instalados com pip freeze(como bundle installou npm shrinkwrap). É melhor salvar uma cópia disso antes de mexer.
Coronel Panic
Cuidado ao fazer isso, você estraga sua pipinstalação quando faz o upgrade requests. A mensagem de erro é cannot import name IncompleteRead.
Paul Rooney
11
Eu tentei um monte de respostas e uma (resposta de pontuação e, portanto, baixo) mais recente produz uma saída muito melhor: stackoverflow.com/questions/2720014/...
FauChristian
Solicitação e discussão de recursos atualizados: github.com/pypa/pip/issues/4551
cledoux
Esta pergunta é tão antiga e tão útil que só quero alertar qualquer pessoa que venha aqui a partir de agora que agora existe uma nova melhor maneira oficial de fazer tudo isso: pipenv. Os documentos estão aqui: docs.pipenv.org/basics e o Pycon 2018 do autor fala sobre o assunto: youtube.com/watch?v=GBQAKldqgZs . Feliz codificação!
Malik A. Rumi

Respostas:

2260

Ainda não há um sinalizador interno, 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 sugira variações nos comentários!

Na versão anterior 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"), conforme sugerido por @jawache. (Sim, você pode substituir grep+ cutpor sedou awkou perlou ...).

O -n1sinalizador para xargsimpede a interrupção de tudo se a atualização de um pacote falhar (obrigado @andsens ).

rbp
fonte
59
Certo :( O problema agora está em github.com/pypa/pip/issues/59 . Mas todas as sugestões parecem ser respondidas com "Sim, mas tenho certeza se X é o caminho certo para fazer Y" ... agora é melhor do que não Praticidade bate pureza :(?
rbp
20
Ele também imprime os pacotes que foram instalados com um gerenciador de pacotes normal (como apt-get ou Synaptic). Se eu executar isso pip install -U, ele atualizará todos os pacotes. Receio que possa causar algum conflito com o apt-get.
Jabba
8
Que tal mudar grep para: egrep -v '^ (\ - e | #)' (eu recebo esta linha ao executá-la no ubuntu 12.10: "## FIXME: não foi possível encontrar o svn URL em dependency_links para este pacote:".
LasseValentini
32
Eu teeusaria um antes de fazer a atualização real para que você possa obter uma lista das versões originais. Por exemplo, pip freeze --local | tee before_upgrade.txt | ...dessa forma, seria mais fácil reverter se houver algum problema.
Emil H
10
Eu adicionei -Hpara sudoevitar uma mensagem de erro irritante: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
Mario S
683

Você pode usar o seguinte código Python. Ao contrário pip freeze, isso não imprimirá avisos e erros 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)
Manishankar Singh
fonte
21
Isso funciona incrivelmente bem… É sempre tão gratificante quando uma tarefa leva MUITO tempo … e oferece um monte de coisas novas! PS: Execute-o como root se você estiver no OS X!
Alex Gray
52
Não há como instalar usando o pip sem chamar um subprocesso? Algo como import pip pip.install('packagename')?
endolith 6/03/12
6
Eu envolvi isso em um fabfile.py . Obrigado!
Josh K
5
@ BenMezger: Você realmente não deveria estar usando pacotes de sistema no seu virtualenv. Você também não deve executar mais que um punhado de programas conhecidos e confiáveis ​​como root. Execute seus virtualenvs com --no-site-packages (padrão nas versões recentes).
jeffcook2150
3
Perfeito para este, a resposta escolhida (acima) falha se um pacote não puder mais ser encontrado. Esse script simplesmente continua para os próximos pacotes, maravilhoso.
Josh
643

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

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

pip-reviewé um garfo de pip-tools. Veja o pip-toolsproblema mencionado por @knedlsepp . pip-reviewpacote funciona, mas o pip-toolspacote não funciona mais.

pip-reviewfunciona no Windows desde a versão 0.5 .

jfs
fonte
2
@hauzer: Ele não suporta Python 3. Embora isso possa ser um erro
jfs
7
@mkoistinen É uma boa ferramenta, mas até ser mesclada no PIP, significa instalar algo adicional que nem todos podem querer fazer.
Wernight
2
@ Daniel: pip-tools não funciona mais, pip-review (fork de pip-tools) funciona.
JFS
7
pip-review funciona muito bem (pelo menos para Python versão 3.5.0)
FredrikHedman
15
Para atualizar tudo sem o modo interativo:pip-review --local --auto
Dlamini
333

Funciona no Windows. Também deve ser bom para os outros. ($ é qualquer diretório em que você esteja, no prompt de comando. por exemplo, C: / Usuários / Nome de usuário>)

Faz

$ pip freeze > requirements.txt

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

$ pip install -r requirements.txt --upgrade

Se você tiver um problema com um determinado pacote que interrompe a atualização (às vezes fica entorpecido), vá para o diretório ($), comente o nome (adicione um # antes) e execute a atualização novamente. Mais tarde, você pode descomentar essa seção. Isso também é ótimo para copiar ambientes globais em python.


Outra maneira:

Também gosto do método pip-review:

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 continua na próxima.

azazelspeaks
fonte
29
Você deve remover requirements.txt's =={version}. Por exemplo: python-dateutil==2.4.2para python-dateutilpara todas as linhas.
Youngminz 15/05
4
Descobri que isso não atualizou os pacotes no macOS.
jkooker
10
@youngminz Eu recomendaria um rápido 'Replace all "=="> "> ="' em seu editor / ide antes de executar 'pip install ...' para corrigir isso #
Amaury Liet
7
para Linux: $ pip freeze | cut -d '=' -f1> requirements.txta fim de remover a versão
Cavaz
1
Se o shell que você usa é bash, você pode encurtar-lo em um comando via pip3 install -r <(pip3 freeze) --upgrade Efetivamente, <(pip3 freeze)é um pipe anônimo, mas ele vai agir como um objeto de arquivo
Sergiy Kolodyazhnyy
128

Versão Windows após consulta de excelente documentação para FORpor Rob van der Woude

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
Piotr Dobrogost
fonte
19
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i Mais rápido, uma vez que só vai tentar atualizar pacotes "desatualizados"
Refael Ackermann
3
@RefaelAckermann Eu suspeito que isso será mais lento que o original :) Para saber quais pacotes estão desatualizados, o pip precisa primeiro verificar qual é a versão mais recente de cada pacote. Ele faz exatamente o mesmo que o primeiro passo na atualização e não prossegue se não houver uma versão mais recente disponível. No entanto, em sua versão, o pip verificará as versões duas vezes, a primeira vez para estabelecer a lista de pacotes desatualizados e a segunda vez ao atualizar os pacotes nessa lista.
Piotr Dobrogost
2
@RefaelAckermann A rotação de pip é uma ordem de magnitude mais rápida que a versão de um pacote pela rede, de modo que esse é o número de verificações que devem ser otimizadas e não o número de rotações. O meu faz n testes, o seu faz n + m testes.
Piotr Dobrogost
2
+1 - É 20 de abril de 2019, estou usando o Python 3.7.3 no Windows 10, e essa foi a melhor maneira de atualizar todos os meus pacotes locais.
MacItaly 20/06/19
1
Precisa pular as duas primeiras linhas da saída: for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i. Se isso for executado a partir de um arquivo em lotes, use-o em %%ivez de %i. Observe também que é mais fácil atualizar pipantes de executar este comando usando python -m pip install --upgrade pip.
13139 Andy
127

Use pipupgrade !

$ pip install pipupgrade
$ pipupgrade --verbose --latest --yes

O pipupgrade ajuda a atualizar seu sistema, local ou pacotes a partir de um requirements.txtarquivo! Ele também atualiza seletivamente pacotes que não quebram as alterações. O pipupgrade também garante a atualização dos pacotes presentes em vários ambientes Python. Compatível com Python2.7 +, Python3.4 + e pip9 +, pip10 +, pip18 +, pip19 +.

insira a descrição da imagem aqui

NOTA: Sou o autor da ferramenta.

Achilles Gasper Rasquinha
fonte
1
Este método tem saída mais limpa muito de resposta de @ rbp
Gaia
7
Boa ideia, mas ela fica presa para Checking...sempre quando eu a experimentei.
CGFoX 22/03/19
1
Basta instalar-lo e também preso na verificação[0;93mChecking...[0m
Chris
1
@nathandrake gostaria de abrir um problema na página de problemas?
Achilles Gasper Rasquinha
2
Erro no Windows 10 e Python 3.7.5:ModuleNotFoundError: No module named 'ctypes.windll'
Qin Heyang
74

Você pode apenas imprimir os pacotes desatualizados

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
janrito
fonte
14
Dentro de um virtualenv, faço assim: #pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Jeremy Blanchard
Atualmente, você também pode fazer isso com python -m pip list outdated(embora não esteja no formato de requisitos).
21416 Jacktose
74

Esta opção me parece mais direta e legível:

pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`

A explicação é que pip list --outdatedgera uma lista de todos os pacotes desatualizados neste formato:

Package   Version Latest Type 
--------- ------- ------ -----
fonttools 3.31.0  3.32.0 wheel
urllib3   1.24    1.24.1 wheel
requests  2.20.0  2.20.1 wheel

No comando awk, NR>2pula os dois primeiros registros (linhas) e {print $1}seleciona a primeira palavra de cada linha (como sugerido por SergioAraujo, eu removi, tail -n +3pois awkpode realmente lidar com pular registros).

Marc
fonte
Se uma atualização falhar, nenhuma das atualizações acontecerá.
Boris
2
você pode evitar cauda awk 'NR>2 {print $1}'limpa a saída para você
SergioAraujo
@SergioAraujo, isso faz com que a solução pareça também mais limpa, obrigado pela dica!
Marc
67

A seguinte linha única pode ser útil:

(pip> 20.0)

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

Versões mais antigas:

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, não adicione o -n1sinalizador e defina 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
raratiru
fonte
Tive que adicionar filtros para linhas começando com 'Could' e 'Some', porque aparentemente o pip envia avisos para o stdout :(
Chip Camden
OK, isso é justo: você pode adicionar quantos forem | sed 's/^<First characters of the error>.*//'necessários. Obrigado!
raratiru
14
Ou:pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
Jens
51

Solução mais robusta

Para o pip3, use o seguinte:

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

OSX Oddity

O OSX, em julho de 2017, é enviado 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.

Solução de problemas com soluções populares

Essa solução foi bem projetada e testada 1 , enquanto há problemas até nas soluções mais populares.

  • Problemas de portabilidade devido à alteração dos recursos da linha de comando pip
  • Falha no xargs porque falhas comuns no processo filho pip ou pip3
  • Registro lotado da saída bruta de xargs
  • Confiando em uma ponte de Python para OS e atualizando-a potencialmente 3

O comando acima usa a sintaxe de 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 outros cinco tipos de Linux / Unix. Também é executado no Cygwin64 instalado no Windows 10. É necessário testar no iOS.

[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] Atualizar um componente Python ou PIP que também é usado na atualização de um componente Python ou PIP pode ser uma causa potencial de um impasse ou corrupção de banco de dados de pacotes.

Douglas Daseeco
fonte
1
Outra maneira de superar o BSD jurássico seddo OS X é usar gsed(GNU sed). Para obtê-lo, #brew install gnu-sed
911 Walter Tross
@WalterTross ... Jurassic ... bom uso de adjetivo. Portanto, agora temos duas maneiras de agrupar pacotes de atualização de pip com uma boa trilha de auditoria no terminal. (1) Use a opção -E como na resposta e (2) instale o gsed para sair do período jurássico.
Douglas Daseeco
41

Isso parece mais conciso.

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

Explicação:

pip list --outdated recebe 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 o delimitador, -f1significa obter a primeira coluna.

Portanto, as linhas acima se tornam:

urllib3
wheel

depois passe-os para xargsexecutar o comando pip install -U,, com cada linha como argumentos anexos

-n1limita o número de argumentos passados ​​para cada comando pip install -Ucomo 1

Shihao Xu
fonte
Recebi este avisoDEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
Reman
2
@ Reman: isso é porque você está usando o Pip v9.0.1. Esta é apenas uma mensagem de descontinuação, o que significa que algumas funcionalidades não sobreviverão em uma versão futura do Pip. Nada para se preocupar;)
AlessioX
No entanto, isso deve ser marcado como a solução final. Na verdade, a resposta aceita será executada em todos os seus pacotes de pip, o que é uma perda de tempo se você precisar atualizar apenas 1 ou 2 pacotes. Esta solução, em vez disso, será executada em todos os pacotes desatualizados
AlessioX
34

Eu tive o mesmo problema com a atualização. O problema é que 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, escrevi este pip-upgradeer que também atualiza as versões do seu requirements.txtarquivo para os pacotes escolhidos (ou todos os pacotes).

Instalação

pip install pip-upgrader

Uso

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

cd no diretório do 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 --prereleaseargumento ao seu comando.

Divulgação completa: escrevi este pacote.

Simion Agavriloaei
fonte
8
É isso que o pip deve fazer por padrão.
Nostalg.io
heads-up com a sua ferramenta de alguns escapes de caracteres parecem não funcionar corretamente na minha máquina Windows, mas diferente do que ele está bem
Lucas
realmente não testei no Windows, mas instalarei uma máquina virtual. Obrigado
Simion Agavriloaei
Se virtualenvnão está habilitadopip-upgrade --skip-virtualenv-check
Morse
2
Isso funciona também com uma pasta de requisitos com requisitos comuns, dev e prod. Simplesmente ótimo!
Cshisperer 03/10/19
28

Em https://github.com/cakebread/yolk :

$ pip install -U `yolk -U | awk '{print $1}' | uniq`

no entanto, você precisa obter a gema primeiro:

$ sudo pip install -U yolk
tkr
fonte
1
Última confirmação há 7 anos
Boris
no ano de 2013 AD
dotbit
27

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()]'

`

Salman von Abbas
fonte
4
subprocess.call ("sudo pip install ... caso precise de permissões
Maximiliano Rios
4
@MaximilianoRios Por favor, não sudo pip installuse um ambiente virtual .
Bengt
22

ao usar um virtualenv e se você quiser apenas atualizar os pacotes adicionados ao seu virtualenv, convém:

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

A solução mais simples e rápida que encontrei na discussão do pip é:

pip install pipdate
pipdate

Fonte: https://github.com/pypa/pip/issues/3819

RedEyed
fonte
2
Enquanto outras soluções pararam ao encontrar a menor anomalia, essa solução avisou e pulou o problema para continuar com os outros pacotes. Ótimo!
Serge Stroobandt
18

Solução Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
Apeirogon Prime
fonte
pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}?
Carrega
2
Talvez pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}seja mais apropriado.
brainplot
16

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

atualização do windows powershell foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}

JohnDHH
fonte
congelamento de pip | awk -F '[=]' '{print $ 1}' | xargs pip install -U
JohnDHH 13/03
E para python 3 ... pip3 instala -U $ (pip3 freeze | awk -F '[=]' '{print $ 1}')
Jimmy MG Lim
12

Você pode tentar isso:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
何宗翰
fonte
essa é a maneira mais limpa e legível de atualizar pacotes pip com a maior brevidade possível. ótimo.
Mark Shust em M.academy
12

A gema bastante surpreendente facilita isso.

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

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

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

user1175849
fonte
3
Sua resposta foi alterada de yolkpara yolk3k, sua resposta original definitivamente teve problemas com o python3.
AXO
10

A resposta de @ Ramana funcionou melhor para mim, dentre os que estão aqui, mas 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 site-packagesverificação exclui meus pacotes de desenvolvimento, porque eles não estão localizados no diretório de pacotes de sites do sistema. O try-except simplesmente ignora os pacotes que foram removidos do PyPI.

@ endolith: Eu estava esperando por um fácil pip.install(dist.key, upgrade=True) também, mas não parece que o pip fosse usado para nada além da linha de comando (os documentos não mencionam a API interna e os desenvolvedores do pip não usaram instruções).

chbrown
fonte
No Ubuntu (e outros derivados Debian), pipaparentemente coloca pacotes dentro /usr/local/lib/python2.7/dist-packagesou similares. Você pode usar '/ usr / local / lib /' em vez de 'site-packages' na ifinstrução neste caso.
drevicko
10

O pip_upgrade_outdatedfaz o trabalho. De acordo com seus documentos :

usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD]
                            [--serial | --parallel] [--dry_run] [--verbose]
                            [--version]

Upgrade outdated python packages with pip.

optional arguments:
  -h, --help         show this help message and exit
  -3                 use pip3
  -2                 use pip2
  --pip_cmd PIP_CMD  use PIP_CMD (default pip)
  --serial, -s       upgrade in serial (default)
  --parallel, -p     upgrade in parallel
  --dry_run, -n      get list, but don't upgrade
  --verbose, -v      may be specified multiple times
  --version          show program's version number and exit

Passo 1:

pip install pip-upgrade-outdated

Passo 2:

pip_upgrade_outdated
adrin
fonte
1
Passo 1: pip instalar pip-upgrade-ultrapassada Passo 2: pip-upgrade-ultrapassada ... feito
shao.lo
9

Enviado através de uma solicitação de recebimento para o pessoal da pip ; Enquanto isso, use esta 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
Samuel Marks
fonte
Versão com tratamento de erros (conforme comentário): gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
Samuel Marks
9

Isso pareceu funcionar para mim ...

pip install -U $(pip list --outdated|awk '{printf $1" "}')

Eu usei printfcom um espaço depois para separar corretamente os nomes dos pacotes.

SaxDaddy
fonte
7

Esta é uma solução do PowerShell para Python 3:

pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }

E para Python 2:

pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }

Isso atualiza os pacotes um por um. Então um

pip3 check
pip2 check

posteriormente, verifique se não há dependências quebradas.

Nils Ballmann
fonte
7

E se:

pip install -r <(pip freeze) --upgrade
user8598996
fonte
7

O mais curto e fácil no Windows.

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
Ankireddy
fonte
@Enkouyami no Windows 7, este comando não funciona sem o comando -r. -r deve impedir o caminho para o arquivo de requisitos.
Chockomonkey 16/07/19
6

Meu script:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
Lâmina gelada
fonte
6

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 pacotes desatualizados;
  2. grep -v -i warningcorrespondência invertida ativada warningpara evitar erros ao atualizar
  3. cut -f1 -d1' ' retorna a primeira palavra - o nome do pacote desatualizado;
  4. tr "\n|\r" " "converte o resultado multilinha de cutem uma lista de linha única, separada por espaço;
  5. awk '{if(NR>=3)print}' pula linhas de cabeçalho
  6. cut -d' ' -f1 busca a primeira coluna
  7. xargs -n1 pip install -U pega 1 argumento no canal à esquerda e passa para o comando para atualizar a lista de pacotes.
Alex V
fonte
Aqui está a minha saída: kerberos iwlib PyYAML Could pygpgme Could Could Could ...Observe todos os "Could" s. Aqueles-tronco a partir da saída de pip list -ode "Não foi possível encontrar todos os downloads que satisfaçam o requisito <pacote>"
DrStrangepork
Você pode colar a saída de pip list -o?
Alex V
Os comentários não formatam isso muito bem, mas aqui está um trecho (as terminações de linha são marcadas com ';'):# pip list -o; urwid (Current: 1.1.1 Latest: 1.3.0); Could not find any downloads that satisfy the requirement python-default-encoding; pycups (Current: 1.9.63 Latest: 1.9.68); Could not find any downloads that satisfy the requirement policycoreutils-default-encoding; Could not find any downloads that satisfy the requirement sepolicy;
DrStrangepork 17/17/14
em vez de filtrar todas as linhas que não devem ser usados, gostaria de sugerir para filtrar as linhas onde existe uma atualização: pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ") . Caso contrário, você poderá facilmente perder uma linha que não deseja e obter o resultado mencionado pelo DrStrangeprk.
antibus
Eu recomendo fortemente o uso xargs. pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -UO -rsinalizador garante que pip install -Unão será executado se não houver pacotes desatualizados. O -psinalizador solicita que o usuário confirme antes de executar qualquer comando. Você pode adicionar o -n1sinalizador para que ele seja solicitado antes da instalação de cada pacote separadamente.
Seis
6

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

Sébastien Wieckowski
fonte