anaconda更新所有可能的软件包吗?


150

我尝试了conda search --outdated,其中有很多过时的软件包,例如scipy是0.17.1,但最新的是0.18.0。但是,当我这样做时conda update --all。它不会更新任何软件包。

更新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:
#

更新2

我可以分别更新那些软件包。我能做conda update scipy。但是,为什么我不能一口气更新它们呢?


2
可能是因为最新的技术具有冲突的依赖性。例如,它可能需要NumPy 1.11,但是您有一个不同的程序包需要NumPy 1.10。您可以尝试conda update --all --alt-hint看看它是否提供任何输出...,或者只是尝试conda update scipy看看会发生什么情况(也许带有--alt-hint标志)
darthbith,2016年

@darthbith,请参阅更新1。没有有用的信息。

1
But why I cannot update all of them in one go?可能是因为您至少有一个依赖于较早版本的软件包,因此无法更新任何内容。
cel

是否可以找出哪个依赖于旧软件包?

3
我建议跑步conda update condaconda update --all
gizzmole

Answers:


230

TL; DR:依赖项冲突:更新一个要求 (根据要求)以降级另一个

你是对的:

conda update --all

实际上是要走的路1。Conda始终尝试将软件包升级到该系列的最新版本(例如Python 2.x或3.x)。

依赖冲突

但是有可能存在依赖性冲突(这会阻止进一步升级)。如果发生,康达通常会非常明确地发出警告。

例如X要求Y <5.0,因此Y永远不会> = 5.0

因此,您无法“全部”升级它们。

解决

补充说明:也许它可以工作,但是conda中没有使用Y> 5.0的X的较新版本。可以使用pip进行安装,因为pip中提供了更多软件包。但是请注意,如果存在依赖冲突,pip也会安装软件包,并且通常会破坏conda环境,因为您无法再可靠地使用conda进行安装。如果这样做,请在所有软件包都已安装conda之后作为最后的方法。这是一个hack。

您可以尝试的一种安全方法是在升级时将conda-forge作为渠道添加(-c conda-forge作为标志添加),或者如果确实需要此新版本,则可以找到包含软件包的任何其他渠道。这样,conda也会在此位置搜索可用的软件包。

考虑您的更新:您可以分别升级它们,但是这样做不仅包括升级,而且还包括其他软件包的降级。说,添加到上面的示例中:

X> 2.0要求Y <5.0,X <2.0要求Y> 5.0

因此,将Y> 5.0升级意味着将X降级到<2.0,反之亦然。

当然,这是一个教学示例,但实际上是相同的,通常只是具有更复杂的依赖性和子依赖性

因此,您仍然无法通过单独进行升级来全部升级它们。依赖关系是无法令人满意的,因此早晚要进行升级,升级将再次降级已经升级的软件包。或者破坏软件包的兼容性(通常您不希望这样做!),这只能通过显式调用ignore-dependenciesforce -command来实现。但是,这仅仅是破解围绕问题的方式,绝对不是正常用户的情况下!


1如果您实际上要更新安装软件包,而通常不这样做。在基本环境中运行的命令将以此更新软件包,但是通常您应该使用虚拟环境(conda create -n myenv然后使用conda activate myenv)。执行conda update --all这样的环境里将更新包这样的环境。但是,由于基本环境也是环境,因此答案以相同的方式适用于两种情况。


1
如果您使用的是conda,请在用pip覆盖时不要破坏环境!如果正在使用数据科学环境,请不要隔离安装pkgs,因为pip更有可能破坏环境。
InLaw

1
我同意,使用pip会使conda不再可靠工作。我已将其明确添加到答案中。
Mayou19年

15

为了更精确地回答这个问题:

conda(对于anaconda而言,是miniconda的conda),仅在特定版本的软件包-> major和minor中更新所有内容。这就是范例。

在文档中,您会发现“注意:Conda更新到其系列中的最高版本,因此Python 2.7更新到了2.x系列中的最高版本,而3.6更新到了3.x系列中的最高版本。” doc

如果王先生没有提供可复制的例子,那么只能提供帮助。例如,这真的是他想要更新的虚拟环境吗?或者Wang是否可以得到他/她想要的东西

conda update -n ENVIRONMENT --all

*请在执行“ update --all”之前阅读文档!这自然不会导致所有软件包的更新。因为conda尝试解决环境中所有软件包之间的依赖关系,所以这可能导致DOWNGRADED软件包而没有警告。


如果您只想更新几乎所有内容,则可以创建一个密码文件

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

在运行更新之前。

如果以后要忽略环境中的文件进行更新,则可以执行以下操作:

conda update --all --no-pin

您不应该更新--all。但是,如果需要,您可以节省在克隆环境中进行测试。

第一步应该始终是备份当前规范:

conda list -n py35 --explicit 

(但即使如此,也不总是总是有指向源的链接,例如jupyterlab扩展)

接下来,您可以克隆和更新:

conda create -n py356 --clone py35

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

康达配置


更新:

因为conda的想法很好,但是在复杂的环境中效果不是很好,所以我个人更喜欢nix-shell (or lorri) and poetry[as as superior pip / conda .-)](intro poetry2nix)的组合。


最后,如果您确实需要使用由于依赖关系而导致不兼容的软件包,则可以使用NixOS / nix-pkgs之类的技术


3
此答案假定:1.您使用默认名称和路径(而不是anaconda)安装了miniconda3。2.创建了环境“ py35”。您可能会进一步指定,对于初学者来说,这个答案应该针对他们(我认为),这很容易造成混淆。此外,您并没有真正回答这个问题,因为这可能仍然不允许他升级。那是他的目标。
Mayou18年

当然,让我单独问他们:a)“仅在特定版本内”:这是指Python版本,而不是软件包,对吗?还是可以引用这个?
Mayou36

b)“在文档中,您会找到[...]”:这显然是指Python版本。与这个问题无关,对吗?还是为什么要发布这个?这句话有什么关系?
Mayou36

c)conda update -n ENVIRONMENT --all:我同意这是他/她通常要使用的,而不是更新基本环境。但是,我根本没有在您的答复中找到任何解释,它只是写的,没有涉及在基本环境中使用op命令的区别。
Mayou36

d)“如果只想更新几乎所有内容,则可以创建一个密码文件”:这是一个很好的信息。但这不是OP要求的。他想知道为什么他不能全部更新。他不想确定版本。所以它不会增加答案,对吗?
Mayou36

2

想象一下软件包的依赖关系图,当软件包的数量增加时,在升级/添加软件包时遇到冲突的机会就会大大增加。为避免这种情况,只需在Anaconda中创建一个新环境。

节俭,只安装您需要的东西。对我来说,我在新环境中安装了以下软件包:

  • 大熊猫
  • scikit学习
  • matplotlib
  • 笔记本
  • 凯拉斯

我总共有84个包裹。


这不能回答有关如何升级特定软件包的问题。
Mayou19

0

如果在MS Windows中工作,则可以使用Anaconda导航器。单击环境,在下拉框中默认情况下为“已安装”。您可以选择“可更新”并从此处开始


1
但是,如果要单独选择的内容过多,那么如何选择全部要更新的内容?
beldaz

@beldaz,我尝试通过在最后一列中用“版本”选择所有141个软件包来“解决”它,然后按“应用”。不知道它是否有效:(。然后,我通过按<win> Anaconda Prompt
Pieter21 '19

也可能需要以管理员身份运行
Pieter21 '19

这也不会解决实际问题,请阅读有关依赖性冲突的公认答案。
Mayou19年

-1

更新我使用的所有可能的软件包 conda update --update-all

有用!


4
不,它不会“不”:如果您重新读取OP,则会遇到依赖项冲突。这个答案不能解决也不能解释任何事情
Mayou36

-6

我用conda和解决了这个问题pip

首先,我运行:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

之后,我打开了cmd并运行以下代码

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

最后,您应该matplotlib使用以下代码在pip中进行安装:pip install matplotlib


6
这甚至与OP想要执行的操作并不接近
user8408080 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.