有人要求我查看一些有关 python 的开发操作内容,但我有点卡住了。我正在工作的网络没有连接互联网,所以我一直在设置 Nexus 存储库来引入 docker、java 和 pypi 的依赖项,其他开发人员可以在本地访问和拉取这些依赖项。然而,他们已经开始越来越多地使用 conda,我们的开发网络上有一个固定版本来匹配交付网络。
我正在尝试使用 nexus 的 conda 存储库,尽管每次我尝试安装某些东西时,它都会尝试更新其他所有内容,包括 python 和 conda 版本:
conda version : 4.8.3
conda-build version : 3.18.11
python version : 3.8.3.final.0
我已将 .condarc 文件编辑为:
channels:
- http://master:8041/repository/anaconda-proxy/main/
- http://master:8041/repository/conda-forge/
remote_read_timeout_secs: 1200.0
auto_update_conda: false
channel_priority: false
但是,每次我尝试安装某些东西来缓存依赖项时,我都会收到大量更新。例如:
conda install cudatoolkit
<snip>
The following packages will be downloaded:
package | build
---------------------------|-----------------
alabaster-0.7.12 | py_0 16 KB http://master:8041/repository/anaconda-proxy/main
anaconda-client-1.7.2 | py38_0 172 KB http://master:8041/repository/anaconda-proxy/main
anaconda-project-0.8.4 | py_0 210 KB http://master:8041/repository/anaconda-proxy/main
argh-0.26.2 | py38_0 36 KB http://master:8041/repository/anaconda-proxy/main
.....
任何建议都会很棒。我添加了 auto_update_conda 和 channel_priority 标志,但无济于事。提前致谢。
附加信息: 我是一名 Java 开发人员,只使用了一点 Python,所以我不太熟悉 anaconda 设置,所以如果这比我做的更简单,我深表歉意。
最佳答案
Conda 如何解决
Conda 总是首先尝试在不更改现有软件包的情况下解决安装指令(即,它首先使用 --freeze-installed
标志运行),并且只会继续进行完整解决(您正在做什么)查看)如果它找不到您所请求的包的任何版本,并且该包的所有依赖项已在环境中得到满足。也就是说,这个结果意味着你所要求的是不可能的。或者,如果您想要有效的环境,至少不要通过 CLI。1
问题的核心是,即使只有一个依赖项需要更新,也没有中间模式来表明您想要最小化更改总数(我认为这实际上是一个很好的增强) )。 Conda只有两种求解模式:
- 不做任何更改(
--freeze-installed
)。 - 允许更新所有依赖项 (
--update-deps
)。
异常(exception)情况是aggressive_update_packages和auto_update_conda,每当环境发生变化时,它总是会尝试更新。但您似乎已经意识到可以通过配置设置禁用这些功能。2
手动依赖项更新
这并不意味着您希望完成的任务是不可能的,而是没有一种干净的方法可以通过 CLI 实现自动化。相反,您可能需要手动跟踪需要更新的依赖项(例如,conda search cudatoolkit --info
),首先更新它们(使用特定版本的conda install
),然后尝试再次安装您的软件包。我强烈建议您首先确定您计划安装的 cudatoolkit
的确切版本,否则 conda search cudatoolkit --info
将包含太多信息。
包固定
对于您确实想要绝对修复的软件包,有 package pinning 。您可以对 conda
、python
和其他核心包执行此操作。
基础环境
我发现 base 环境(具有 conda
包的环境)发生了突变,这有点奇怪。相反,我希望软件工程师始终使用非基础环境进行开发和生产。创建新环境很容易,可以使用版本控制的 YAML 文件定义它们,通过在每个项目或每个任务类型的基础上创建它们来模块化地使用它们,并且可以对它们进行修改,而不必担心影响 Conda 基础设施。但是,我并不完全清楚您的设置,因此此评论可能不适用。
[1] 如果不关心有效性(对于生产来说可能不是一个好主意),那么总会有 --no-deps
标志。
[2] 默认的 aggressive_update_packages 软件包经常容易受到攻击(例如 openssl
),因此请小心考虑让它们过时的影响。
关于python - 如何在固定版本上卡住 conda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64067645/