anaconda atualizar todos os pacotes possíveis?

151

Eu tentei o conda search --outdated, existem muitos pacotes desatualizados, por exemplo, o scipy é 0.17.1, mas o mais recente é 0.18.0. No entanto, quando eu faço o conda update --all. Não atualizará nenhum pacote.

atualização 1

conda update --all --alt-hint

Fetching package metadata .......
Solving package specifications: ..........

# All requested packages already installed.
# packages in environment at /home/user/opt/anaconda2:
#

atualização 2

Eu posso atualizar esses pacotes separadamente. Eu posso fazer conda update scipy. Mas por que não consigo atualizar todos eles de uma só vez?

Wang
fonte
2
Pode ser porque o scipy mais recente tem uma dependência conflitante. Por exemplo, ele pode exigir o NumPy 1.11, mas você tem um pacote diferente que requer o NumPy 1.10. Você pode tentar conda update --all --alt-hinte ver se ele dá qualquer saída ... Ou apenas tentar conda update scipye ver o que acontece (talvez com a --alt-hintbandeira)
darthbith
@darthbith, consulte a atualização 1. Nenhuma informação útil.
Wang
1
But why I cannot update all of them in one go?Provavelmente porque você possui pelo menos um pacote que depende de uma versão mais antiga e, portanto, nada pode ser atualizado.
16286
É possível descobrir qual deles depende dos pacotes antigos?
21716 Wang
3
Eu recomendo rodar conda update condaantesconda update --all
gizzmole

Respostas:

230

TL; DR: conflitos de dependência: a atualização de um requer (por seus requisitos) o downgrade de outro

Você está certo:

conda update --all

é realmente o caminho a percorrer 1 . A Conda sempre tenta atualizar os pacotes para a versão mais recente da série (por exemplo, Python 2.x ou 3.x).

Conflitos de dependência

Mas é possível que haja conflitos de dependência (que impedem uma atualização adicional). A Conda geralmente alerta muito explicitamente se elas ocorrerem.

por exemplo, X requer Y <5,0, portanto, Y nunca será> = 5,0

É por isso que você 'não pode' atualizar todos eles.

Resolver

Para adicionar: talvez ele funcione, mas uma versão mais recente do X trabalhando com Y> 5.0 não está disponível no conda. É possível instalar com o pip, pois mais pacotes estão disponíveis no pip. Mas esteja ciente de que o pip também instala pacotes se existirem conflitos de dependência e que geralmente interrompe seu ambiente conda no sentido de que você não pode mais instalar com confiança o conda. Se você fizer isso, faça-o como último recurso e após todos os pacotes terem sido instalados com o conda. É um truque.

Uma maneira segura que você pode tentar é adicionar o conda-forge como um canal ao atualizar (adicionar -c conda-forgecomo um sinalizador) ou qualquer outro canal encontrado que contenha seu pacote, se você realmente precisar desta nova versão . Dessa forma, o conda também pesquisa nesses locais por pacotes disponíveis.

Considerando sua atualização : você pode atualizá-los separadamente, mas isso inclui não apenas uma atualização, mas também um downgrade de outro pacote. Diga, para adicionar ao exemplo acima:

X> 2.0 requer Y <5.0, X <2.0 requer Y> 5.0

Portanto, atualizar Y> 5.0 implica fazer o downgrade de X para <2.0 e vice-versa.

( este é um exemplo pedagógico, é claro, mas é o mesmo na realidade, geralmente apenas com dependências e subdependências mais complicadas )

Portanto, você ainda não pode atualizá- los todos , fazendo as atualizações separadamente; as dependências não são satisfatórias; portanto, mais cedo ou mais tarde, uma atualização fará o downgrade de um pacote já atualizado novamente. Ou quebre a compatibilidade dos pacotes (que você geralmente não quer!), O que só é possível invocando explicitamente um comando ignore-dependencies e force- command. Mas isso é apenas para cortar o seu caminho em torno de questões, definitivamente não é o caso do usuário normal!


1 Se você realmente deseja atualizar os pacotes da sua instalação, o que geralmente não é . O comando executado no ambiente base atualizará os pacotes, mas geralmente você deve trabalhar com ambientes virtuais ( conda create -n myenve depois conda activate myenv). Executar conda update --allem um ambiente como esse atualizará os pacotes dentro desse ambiente. No entanto, como o ambiente base também é um ambiente, a resposta se aplica a ambos os casos da mesma maneira.

Mayou36
fonte
1
Se você estiver usando o conda, não quebre o ambiente ao substituir o pip! Se você estiver usando um ambiente de ciência de dados, NÃO instale os pacotes isolados, porque é mais provável que o pip interrompa seu ambiente.
InLaw 28/09/19
1
Eu concordo, usar pip faz com que o conda não funcione mais de maneira confiável. Eu adicionei isso na resposta explicitamente.
usar o seguinte código
15

Para responder com mais precisão à pergunta:

O conda (que é conda para o miniconda e para o Anaconda) atualiza tudo, exceto APENAS, dentro de uma versão específica de um pacote -> maior e menor. Esse é o paradigma.

Na documentação, você encontrará "OBSERVAÇÃO: O Conda é atualizado para a versão mais alta de sua série, portanto, o Python 2.7 atualiza para o mais alto disponível na série 2.x e 3.6 para o mais alto disponível na série 3.x". doc

Se Wang não der um exemplo reproduzível, só podemos ajudar. Por exemplo, é realmente o ambiente virtual que ele deseja atualizar ou Wang pode obter o que deseja?

conda update -n ENVIRONMENT --all

* POR FAVOR, leia os documentos antes de executar "update --all"! Isso não leva a uma atualização de todos os pacotes por natureza. Como o conda tenta resolver o relacionamento de dependências entre todos os pacotes em seu ambiente, isso pode levar a pacotes DOWNGRADED sem avisos.


Se você quiser atualizar quase tudo, poderá criar um arquivo pin

echo "conda ==4.0.0" >> ~/miniconda3/envs/py35/conda-meta/pinned
echo "numpy 1.7.*" >> ~/miniconda3/envs/py35/conda-meta/pinned

antes de executar a atualização.

Se mais tarde você desejar ignorar o arquivo em seu ambiente para uma atualização, poderá:

conda update --all --no-pin

Você não deve atualizar --all. Se você precisar, no entanto, é mais seguro testá-lo em um ambiente clonado.

O primeiro passo deve ser sempre fazer backup da sua especificação atual:

conda list -n py35 --explicit 

(mas, mesmo assim, nem sempre há um link para a fonte disponível, como para extensões jupyterlab)

Em seguida, você pode clonar e atualizar:

conda create -n py356 --clone py35

conda activate py356
conda config --set pip_interop_enabled True # for conda>=4.6
conda update --all

configuração conda


atualizar:

Como a idéia de conda é boa, mas não está funcionando muito bem em ambientes complexos, eu pessoalmente prefiro a combinação de nix-shell (or lorri) and poetry[como superior pip / conda .-)] ( introdução poetry2nix ).


Finalmente, se você realmente precisa trabalhar com pacotes que não são compatíveis devido a suas dependências, é possível com tecnologias como NixOS / nix-pkgs .

Em lei
fonte
3
Esta resposta assume: 1. você instalou o miniconda3 com o nome e o caminho padrão (e não, digamos anaconda) 2. que você criou um ambiente "py35". Você pode especificar que ainda mais os iniciantes, para quem essa resposta deve ser direcionada (na minha opinião), podem ficar facilmente confusos. Além disso, você não deve realmente responder à pergunta, pois isso ainda pode não permitir a atualização. E esse é o objetivo dele.
usar o seguinte código
Claro, deixe-me perguntar individualmente: a) "SOMENTE dentro de uma versão específica": refere-se à versão Python, não aos pacotes, certo? Ou você pode citar isso, por favor?
Mayou36
b) "Na documentação você encontrará [...]": isso se refere claramente à versão do Python. Não tem nada a ver com a pergunta, correto? Ou por que você publica isso? Como essa declaração é relevante?
Mayou36
c) conda update -n ENVIRONMENT --all: Concordo que é isso que ele / ela geralmente deseja usar, não para atualizar o ambiente base. No entanto, não encontro uma explicação na sua resposta sobre isso, está apenas escrito e não se refere à diferença de usar o comando do op no ambiente base.
Mayou36
d) "Se você deseja atualizar quase tudo, pode criar um arquivo pin": esta é uma boa informação. Mas não é o que o OP pediu. Ele quer saber por que ele não pode atualizar tudo . Ele não quer definir versões. Portanto, não acrescenta à resposta, acrescenta?
Mayou36
2

Imagine o gráfico de dependência de pacotes, quando o número de pacotes aumenta, a chance de encontrar um conflito ao atualizar / adicionar pacotes é muito maior. Para evitar isso, basta criar um novo ambiente no Anaconda.

Seja econômico, instale apenas o que você precisa. Para mim, instalei os seguintes pacotes no meu novo ambiente:

  • pandas
  • scikit-learn
  • matplotlib
  • caderno
  • keras

E eu tenho 84 pacotes no total.

Espectral
fonte
Isso não responde à pergunta sobre como atualizar um pacote específico.
precisa saber é o seguinte
0

se estiver trabalhando no MS windows, você pode usar o navegador Anaconda. clique no ambiente, na caixa suspensa, é "instalado" por padrão. Você pode selecionar "atualizável" e começar a partir daí

David
fonte
1
Mas como você seleciona tudo para atualizar quando há muitos para selecionar individualmente?
beldaz
@beldaz, tentei 'resolvê-lo' selecionando todos os 141 pacotes na última coluna com 'Versão' e, em seguida, pressione Aplicar. . Não tenho certeza se ele funciona :( consola Anaconda Então eu só abriu pressionando <ganhar> Anaconda Prompt
Pieter21
Executar como Administrador também pode ser necessária
Pieter21
Isso também não resolverá o problema real, leia a resposta aceita sobre conflitos de dependência.
Mayou36
-1

Para atualizar todos os pacotes possíveis que usei conda update --update-all

Funciona!

nein nein
fonte
4
Não, "não": se você reler o OP, serão encontrados conflitos de dependência. Essa resposta não resolve nem explicar nada
Mayou36
-6

Resolvi esse problema com condae pip.

Em primeiro lugar, eu corro:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

Depois disso, abri o cmd e executei este código que

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

Por fim, você deve instalar matplotlibno pip por este código quepip install matplotlib

Mantakeke
fonte
6
Isto não é nem perto do que OP queria fazer
user8408080