从零开始的 Conda 重开之旅
因为实际项目中遇到 scipy 的版本要更新至最新版本, 但是自己的 anaconda 已经使用了四年多没有更换, 导致 base 环境下的 Python 版本始终在 3.7 没有更新,一折腾结果出了大问题。
我自己因为优化问题需要 scipy
最小化功能支持边界限制 (在 1.7.0 版本以后)。现在的最新版本号已经到了 1.9.1, 而机器上的 scipy 只有 1.3.1, python 3.7 也限制了最高支持的 scipy 版本,自然不升级肯定没得用没得用了.
升级 base 环境
到这种时候其实有两种方法, 一种方法是利用 conda 直接新建一个 python 更高版本的环境, 此时就可以正常使用. 不过这样的话一来每次可能都需要切换至这一个专门的环境才行, 原来的 base 环境肯定也越用越少了.
还有一种方法, 直接升级 base 对应的 python 版本. conda update conda; conda install python=$pythonversion$
. 不过因为在 base 环境下之前实在安装太多包了, 导致利用 conda install
命令升级 python, 需要解决的环境依赖实在太过多, 导致一直无法运行命令.
在这种情况下 conda uninstall
命令都变得不好用了, 因为包的依赖关系实在太多, 难以计算依赖. Stackoverflow 论坛上也给出了一些方法, 自己尝试下来发现都不是很全名, 最好用的办法是先拿到所有非关键的包的列表, 然后再卸载.
利用后来安装 Miniconda 时候的提示, 一些初始环境的包如下所示
#, _libgcc_mutex, _openmp_mutex, brotlipy, ca-certificates, certifi, cffi, charset-normalizer, colorama, conda, conda-content-trust, conda-package-handling, cryptography, idna, ld_impl_linux-64, libffi, libgcc-ng, libgomp, libstdcxx-ng, ncurses, openssl, pip, pycosat, pycparser, pyopenssl, pysocks, python, readline, requests, ruamel_yaml, setuptools, six, sqlite, tk, tqdm, tzdata, urllib3, wheel, xz, yaml, zlib
把上面的 ,
替换为 \n
然后命名为 key
文件. 利用命令
conda list | awk {'print $1'} | grep -v -f key > packages
# conda list | awk {'print $1'} | grep -v -f key | tac > packages
for i in `cat packages`; do echo $i; conda remove --force $i -y; done
就可以在不考虑依赖的时候, 把这些包直接都删除了, 除非 conda 限制某些包无法删除.
在我自己删包的时候, 遇到的一个问题是删到后来各个包都有 toolz
的依赖, 导致 conda 都无法删除, 但在高版本的 conda
里没有这个包, 不知道是什么原因.
然后不能把上面的命令替换为 pip
的版本, 如下所示. 因为 conda 不同环境的包存储的逻辑和 pip 完全不一样, 在 base 环境下完全有可能删除其它环境的包, 所以千万不要用...
python -m pip freeze | grep -v -f key > requirements.txt
python -m pip uninstall -r requirements.txt -y
理论上按照上面的方法把多余的包删除外以后, 就可以顺利升级 python 版本了吧 (大概), 我自己是无缘尝试了... 因为我用了 pip 的方法把一些环境已经给删崩了...
其实这个因为 base 环境太过庞大, 导致无法升级的问题, 开发者们一直很关心, 按照介绍应该可以在 5.0 的大版本更新的时候解决, 把 conda 命令从现有的 Python 包里面抽离出来. (不过老环境应该还是没救了...)
https://github.com/conda/conda/issues/11342
所以我选择夺舍重开了.
Miniconda 的重开之旅
这里我们需要把安装在服务器上的 Anaconda 完全卸载. 因为本身就装在本地的目录下, 所以把目录一删除就完事了. 其次再删除一些配置文件和缓存文件, 比如在 .bashrc
文件中的 conda init
部分内容, 以及家目录下的 .conda
文件夹和 .condarc
文件等. 不过因为我后面还要安装 Miniconda, 所以 .condarc
文件就没有删除, 直接后面使用了.
https://stackoverflow.com/questions/22585235/python-anaconda-how-to-safely-uninstall
然后是下载 Minicoonda 并安装
https://docs.conda.io/en/latest/miniconda.html
最新下载的版本已经是 python=3.9.12
了. 注意更新一下源 (更新 ~/.condarc
文件)
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- conda-forge
- defaults
channel_priority: flexible
创建环境如下, 把几个常用的环境都创建安装一下
conda create -n pymat python=3.9 # pymatgen, ase
conda create -n phonon python=3.9 # phononpy, dyaphopy
conda create -n sscha python=2.7
conda create -n py27 python=2.7
一些基本的安装包在每个环境都装一下: numpy, pandas, matplotlib, scipy
, 后面有需要再按需安装.