anaconda 更新所有可能的软件包?
Posted
技术标签:
【中文标题】anaconda 更新所有可能的软件包?【英文标题】:anaconda update all possible packages? 【发布时间】:2016-12-22 15:51:13 【问题描述】:我试过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
。但是为什么我不能一次更新所有这些?
【问题讨论】:
可能是因为最新的 scipy 存在依赖冲突。例如,它可能需要 NumPy 1.11,但您有一个不同的包需要 NumPy 1.10。您可以尝试conda update --all --alt-hint
看看它是否提供任何输出...或者只是尝试conda update scipy
看看会发生什么(可能使用--alt-hint
标志)
@darthbith 请参考更新1。没有有用的信息。
But why I cannot update all of them in one go?
可能是因为您至少有一个依赖于旧版本的软件包,因此无法更新任何内容。
有没有可能找出哪个依赖旧包?
我建议在 conda update --all
之前运行 conda update conda
【参考方案1】:
TL;DR:依赖冲突:更新一个需要 (根据它的要求)降级另一个
你是对的:
conda update --all
实际上是要走的路1。 Conda 总是尝试将软件包升级到该系列中的最新版本(例如 Python 2.x 或 3.x)。
依赖冲突
但可能存在依赖冲突(阻止进一步升级)。如果它们发生,Conda 通常会非常明确地发出警告。
例如X 要求 Y = 5.0
这就是你“不能”全部升级的原因。
正在解决
补充一点:也许它可以工作,但在 conda 中没有更新版本的 X 与 Y > 5.0 一起工作。可以使用 pip 安装,因为 pip 中提供了更多软件包。但请注意,如果存在依赖冲突,pip 也会安装软件包,并且它通常会破坏您的 conda 环境,因为您无法再可靠地使用 conda 进行安装。如果您这样做,请作为最后的手段,并且在所有软件包都安装了 conda 之后。这更像是一种黑客攻击。
您可以尝试的一种安全方法是在升级时添加conda-forge 作为频道(添加-c conda-forge
作为标志)或您找到的包含您的软件包的任何其他频道如果您真的需要这个新版本。这样 conda 也会在这个地方搜索可用的包。
考虑您的更新:您可以分别升级它们,但这样做不仅包括升级,还包括另一个包的降级。说,添加到上面的例子:
X > 2.0 要求 Y 5.0
所以升级 Y > 5.0 意味着将 X 降级到
(当然,这是一个教学示例,但实际上是一样的,通常只是具有更复杂的依赖关系和子依赖关系)
所以你仍然不能通过单独升级来升级它们;依赖关系是不能满足的,所以早晚,升级将再次降级已经升级的包。或者破坏包的兼容性(您通常不想要!),这只能通过显式调用 ignore-dependencies 和 force-命令来实现。但这只是hack解决问题的方法,绝对不是普通用户的情况!
1 如果你真的想更新你安装的包,你通常不要。在基本环境中运行的命令将更新其中的包,但通常您应该使用虚拟环境(conda create -n myenv
然后conda activate myenv
)。在这样的环境中执行conda update --all
将更新在这个环境中的包。然而,由于基础环境也是一个环境,所以答案同样适用于这两种情况。
【讨论】:
如果您使用 conda,请不要在使用 pip 覆盖时破坏您的环境!如果正在使用数据科学环境,请不要安装 pkgs 隔离,因为您更有可能使用 pip 破坏您的环境。 我同意,使用 pip 会使 conda 不再可靠地工作。我已明确将此添加到答案中。 @Mayou36 InLaw 实际上说的更加严格。 pip 破坏 conda env。对于只想“让它运行”而不是为软件包安装恶魔而烦恼的人来说,这是件好事。 @StarShine 你能详细说明一下吗?确实,在使用 pip 安装后,您不应该再使用 conda 安装,从这个意义上说,它破坏了它。但并不是说它不再可用,可以进行 pip 安装并且可以运行代码。但是,这是一个完全“合法”的过程,因为 pip 包可以包含在 env.yaml 中,并在 on the conda page 中提及。那么你到底想改变什么? 好吧,一个 conda 可以尝试检测到这一点,并通知用户在继续进行时可能存在问题。它会为像我这样的人节省一些时间来发现它。【参考方案2】:要更准确地回答问题:
conda(与 Anaconda 一样是 miniconda 的 conda)仅在包的特定版本中更新所有内容 -> 主要和次要版本。这就是范式。
在文档中您会发现“注意:Conda 更新到其系列中的最高版本,因此 Python 2.7 更新到 2.x 系列中的最高可用版本,3.6 更新到 3.x 系列中可用的最高版本。 " doc
如果王没有给出一个可重复的例子,那只能提供帮助。 例如真的是他想更新的虚拟环境还是王能得到他/她想要的东西
conda update -n ENVIRONMENT --all
*请在执行“update --all”之前阅读文档! 本质上,这不会导致所有软件包的更新。因为 conda 试图解析环境中所有包之间的依赖关系,这可能导致 DOWNGRADED 包没有警告。
如果你只想更新几乎所有,你可以创建一个 pin 文件
echo "conda ==4.0.0" >> ~/miniconda3/envs/py35/conda-meta/pinned
echo "numpy 1.7.*" >> ~/miniconda3/envs/py35/conda-meta/pinned
在运行更新之前。 conda issues not pinned
如果以后您想忽略 env 中的文件进行更新,您可以这样做:
conda update --all --no-pin
您不应该更新 --all。如果您仍然需要它,您可以在克隆环境中进行测试。
第一步应该始终是备份您当前的规范:
conda list -n py35 --explicit
(但即便如此,也并不总是提供指向可用源的链接——比如 jupyterlab 扩展)
接下来你可以clone更新:
conda create -n py356 --clone py35
conda activate py356
conda config --set pip_interop_enabled True # for conda>=4.6
conda update --all
conda config
更新:
目前我会使用 mamba(或 micromamba)作为 conda pkg-manager 替代
更新:
因为 conda 的想法很好,但在复杂的环境中效果不佳,我个人更喜欢 nix-shell
(或 lorri
)和 poetry
的组合[作为优越的 pip/conda .-)] (intro poetry2nix)。
或者,您可以使用nix
和mach-nix
(您只需要您的需求文件。它可以最好地解决和构建环境。
在 Linux / macOS 上,您可以使用 nix 之类的
nix-env -iA nixpkgs.python37
进入一个环境,例如在本例中为 Python3.7(当然可以更改版本)
或者作为一个非常好的 Python(高级)环境,您可以使用 mach-nix(带有 nix)之类的
mach-nix env ./env -r requirements.txt
(甚至支持 conda [但目前处于测试阶段])
或通过 api 之类的
nix-shell -p nixFlakes --run "nix run github:davhau/mach-nix#with.ipython.pandas.seaborn.bokeh.scikit-learn "
最后,如果你真的需要使用由于依赖关系而不兼容的包,可以使用NixOS/nix-pkgs 等技术。
【讨论】:
这个答案假设:1.您使用默认名称和路径(而不是 anaconda)安装了 miniconda3 2.您创建了一个环境“py35”。您可以进一步指定作为初学者,这个答案应该针对谁(在我看来),很容易混淆。此外,您并没有真正回答这个问题,因为这可能仍然不允许他升级。这就是他的目标。 当然,让我单独问他们:a)“仅在特定版本内”:这是指 Python 版本,而不是包,对吗?或者你能引用这个吗? b) “在文档中你会发现 [...]”:这显然是指 Python 版本。跟题目没关系吧?或者你为什么要发这个?该声明有何相关性? c)conda update -n ENVIRONMENT --all
:我同意这是他/她通常想要使用的,而不是更新基础环境。但是,我在您的回答中根本找不到解释,只是写出来的,并没有提及在基础环境中使用op命令的区别。
e) “你不应该更新 --all”:为什么不呢?我确实认为这是正确的方法,也是 OP 想要的(模可能在虚拟环境中),那么你为什么说他不应该这样做呢?克隆环境与它有什么关系?【参考方案3】:
想象一下包的依赖关系图,当包的数量变大时,升级/添加包时遇到冲突的几率要高得多。为避免这种情况,只需在 Anaconda 中创建一个新环境即可。
节俭,只安装你需要的东西。对我来说,我在新环境中安装了以下软件包:
熊猫 scikit 学习 matplotlib 笔记本 keras我总共有 84 个包裹。
【讨论】:
这并没有回答关于如何升级特定包的问题。【参考方案4】:如果在 MS windows 下工作,您可以使用 Anaconda 导航器。点击环境,在下拉框中,默认为“已安装”。您可以选择“可更新”并从那里开始
【讨论】:
但是如果要单独选择的数量太多,如何选择全部更新? @beldaz,我尝试通过选择最后一列中的所有 141 个包并选择“版本”来“解决”它,然后按应用。不确定它是否有效:(。然后我只是按我用conda
和pip
解决了这个问题。
首先,我运行:
conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5
之后,我打开cmd并运行这段代码
pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5
最后,您应该使用pip install matplotlib
的代码在pip 中安装matplotlib
【讨论】:
这与 OP 想要做的还差得很远【参考方案6】:为了更新我使用的所有可能的包conda update --update-all
有效!
【讨论】:
不,它“不”:如果您重新阅读 OP,则会遇到依赖冲突。这个答案没有解决也没有解释什么【参考方案7】:我同意 Mayou36。
例如,我在基础环境中安装新包时犯了一个错误,对某些包使用 conda,对其他一些包使用 pip。
为什么这样不好?
1.这些都无助于更新已经 > 安装 > 从 PyPI 通过 pip 安装的软件包,或任何使用 python 安装的软件包 setup.py 安装。 conda list 会给你一些关于 您在环境中拥有的基于 pip 的 Python 包,但它不会这样做 更新它们的任何特别之处。
我的所有项目都在同一个环境中!而且我使用了 update all - 这很糟糕并且没有更新所有 -。
因此,最好的办法是为每个项目创建一个新环境。为什么?
2. Conda 环境是一个目录,其中包含您已安装的特定 Conda 包集合。例如,你 可能正在从事一个需要 NumPy 1.18 及其 依赖关系,而另一个环境与完成 项目有 NumPy 1.12(可能是因为 1.12 版本是最 项目完成时 NumPy 的当前版本)。如果你 改变一个环境,你的其他环境不受影响。你 可以轻松激活或停用环境,这就是您如何 在它们之间切换。
所以,总结一下:
为每个项目创建一个新的environment
注意 conda 和 pip 中的 differences
3.仅包含您实际需要的软件包,并仅在必要时正确地update 它们。
【讨论】:
这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review以上是关于anaconda 更新所有可能的软件包?的主要内容,如果未能解决你的问题,请参考以下文章