ChatGPT解决这个技术问题 Extra ChatGPT

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

我试过 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

M
Mayou36

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

你说的对:

conda update --all

实际上是go1的方法。 Conda 总是尝试将软件包升级到该系列中的最新版本(例如 Python 2.x 或 3.x)。

依赖冲突

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

例如 X 要求 Y <5.0,所以 Y 永远不会 >= 5.0

这就是为什么您“不能”全部升级它们的原因。

正在解决

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

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

考虑到您的更新:您可以分别升级它们,但这样做不仅包括升级,还包括另一个包的降级。说,添加到上面的例子:

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

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

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

因此,您仍然无法通过单独进行升级来全部升级;依赖关系是不能满足的,所以早晚,升级将再次降级已经升级的包。或者破坏包的兼容性(您通常不想要!),这只能通过显式调用忽略依赖项和强制命令来实现。但这只是为了解决问题,绝对不是普通用户案例!

1 如果你真的想更新你安装的包,你通常不要。在基本环境中运行的命令将更新其中的包,但通常您应该使用虚拟环境(conda create -n myenv,然后是 conda activate myenv)。在这样的环境中执行 conda update --all 将更新这个环境中的包。然而,由于基础环境也是一个环境,所以答案以同样的方式适用于这两种情况。


如果您使用 conda,请不要在使用 pip 覆盖时破坏您的环境!如果正在使用数据科学环境,请不要安装 pkgs 隔离,因为您更有可能使用 pip 破坏您的环境。
我同意,使用 pip 会使 conda 不再可靠地工作。我已将其明确添加到答案中。
@Mayou36 InLaw 实际上所说的更加严格。 pip 打破了 conda 环境。对于只想“让它运行”而不是为软件包安装恶魔而烦恼的人来说,这是件好事。
@StarShine 你能详细说明一下吗?确实,在使用 pip 安装后,您不应该再使用 conda 安装,从这个意义上说,它破坏了它。但并不是说它不再可用,可以进行 pip 安装并且可以运行代码。但是,这是一个完全“合法”的过程,因为 pip 包可以包含在 env.yaml 中并被提及 on the conda page。那么你到底想改变什么?
好吧,一个 conda 可以尝试检测到这一点,并通知用户在继续进行时可能存在问题。它会为像我这样的人节省一些时间来发现它。
I
InLaw

要更准确地回答这个问题:

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 .-)] ({1 })。

或者,您可以使用 nixmach-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 想要的(模可能在虚拟环境中),那么你为什么说他不应该这样做呢?克隆环境与它有什么关系?
佚名

想象一下包的依赖关系图,当包的数量变大时,升级/添加包时遇到冲突的几率要高得多。为避免这种情况,只需在 Anaconda 中创建一个新环境即可。

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

熊猫

scikit-学习

matplotlib

笔记本

喀拉斯

我总共有 84 个包裹。


这没有回答有关如何升级特定软件包的问题。
A
Anna Pas

我同意Mayou36。

例如,我在基础环境中安装新包时犯了一个错误,其中一些包使用 conda,其他一些包使用 pip。

为什么这很糟糕?

1.这些都无助于更新已经 > 安装 > 通过 pip 从 PyPI 安装的软件包,或使用 python setup.py install 安装的任何软件包。 conda list 会给你一些关于你在环境中基于 pip 的 Python 包的提示,但它不会做任何特别的更新它们。

而且我的所有项目都在同一个环境中!而且我使用了全部更新-这很糟糕并且没有全部更新-。

所以,最好的办法是为每个项目创建一个新环境。为什么?

2. Conda 环境是一个目录,其中包含您已安装的特定 Conda 软件包集合。例如,您可能正在从事一个需要 NumPy 1.18 及其依赖项的研究项目,而与已完成项目相关的另一个环境具有 NumPy 1.12(可能是因为 1.12 版是项目完成时 NumPy 的最新版本)。如果您更改一个环境,您的其他环境不会受到影响。您可以轻松地激活或停用环境,这就是您在它们之间切换的方式。

所以,总结一下:

为每个项目创建一个新环境注意 conda 和 pip 的差异

3.仅包含您实际需要的包,并仅在必要时正确update它们。


这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
D
David

如果在 MS windows 中工作,您可以使用 Anaconda 导航器。点击环境,在下拉框中,默认为“已安装”。您可以选择“可更新”并从那里开始


但是,当单独选择太多时,如何选择全部更新?
@beldaz,我尝试通过在最后一列中选择“版本”的所有 141 个包来“解决”它,然后按应用。不确定它是否有效:(。然后我只是按 Anaconda Prompt 打开了 Anaconda 控制台
可能还需要以管理员身份运行
这也不能解决实际问题,请阅读有关依赖冲突的公认答案。
r
rdas

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

有用!


不,它“不是”:如果您重新阅读 OP,则会遇到依赖冲突。这个答案不能解决也不能解释任何事情
D
Dennis Vash

我用 condapip 解决了这个问题。

首先,我运行:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

之后,我打开 cmd 并运行这段代码

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

最后,您应该通过以下代码在 pip 中安装 matplotlib pip install matplotlib


这甚至不接近 OP 想要做的事情