Conda 簡介
Conda 是一個(gè)開源的包管理系統(tǒng)和環(huán)境管理系統(tǒng),可在 Windows、macOS 和 Linux 上運(yùn)行。 Conda 可快速安裝、運(yùn)行和更新包及其依賴項(xiàng)。 Conda 可以輕松地在計(jì)算機(jī)上創(chuàng)建、保存、加載和切換環(huán)境。 它是為 Python 程序而創(chuàng)造的,但它可以打包和分發(fā)任何語言的軟件。
簡單來說,conda可以讓我們一行命令安裝更新卸載程序,以及進(jìn)行環(huán)境管理。
下圖是一個(gè)實(shí)際的例子。我用conda 創(chuàng)建了兩個(gè)虛擬環(huán)境:R4 和R41,分別用于運(yùn)行4.0 和 4.1 的R。而且在各自對(duì)應(yīng)的環(huán)境中,安裝了相應(yīng)版本的R包。 下圖是vs code界面,我可以很方便的在多個(gè)版本間切換, 同時(shí)創(chuàng)建多個(gè)R控制臺(tái),極大提高了效率。(vs code可以通過ssh 連接服務(wù)器,所以我現(xiàn)在都很少用RStudio server了。)

Conda 安裝
conda 是包含在 Anaconda 里的。我們安裝了Anaconda就可以使用Conda了。
Anaconda是一個(gè)免費(fèi)開源的Python和R語言的發(fā)行版本,用于計(jì)算科學(xué)(數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、大數(shù)據(jù)處理和預(yù)測分析),Anaconda致力于簡化軟件包管理系統(tǒng)和部署。Anaconda的包使用軟件包管理系統(tǒng)Conda進(jìn)行管理。
Anaconda 有個(gè)人版,商業(yè)版,企業(yè)版,團(tuán)隊(duì)版。我們使用個(gè)人版,因?yàn)槠渌姹疽X。去https://www.anaconda.com/products/individual 下載。本文,主要在Linux下演示,所以下載Linux版本的。

網(wǎng)絡(luò)不好,可以去清華鏡像下載:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
通過在瀏覽器點(diǎn)擊鏈接下載,或者復(fù)制下載鏈接來,在命令行下載
## 下載
$ wget -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2021.05-Linux-x86_64.sh
## 查看
$ ls
Anaconda3-2021.05-Linux-x86_64.sh
安裝通過bash 運(yùn)行
$ bash Anaconda3-2021.05-Linux-x86_64.sh
下面是一些安裝過程中的提示:

按回車鍵(Enter)。

按回車鍵,慢慢跳過?;蛘甙磓。

輸入yes,回車

設(shè)置安裝地址, 默認(rèn)是 ">>>" 前面那個(gè)地址。使用默認(rèn)地址,直接回車若自定義按照地址,在">>>"后面輸入新的的地址。這里我直接回車

是否conda init 官方推薦yes, 我也yes 回車。不yes的話,你之后得手動(dòng)設(shè)置一下才能用conda
??♀?
之后就安裝成功了。不過最好運(yùn)行一個(gè)命令
$ conda config --set auto_activate_base false
anaconda 安裝好后,默認(rèn)有一個(gè) base 的環(huán)境。不運(yùn)行上面那命令的情況,每次你打開命令行,終端,都會(huì)激活base環(huán)境。在anaconda 的環(huán)境下,運(yùn)行命令,會(huì)優(yōu)先調(diào)用anaconda環(huán)境下的程序。
比如下圖例子,在系統(tǒng)環(huán)境下和anaconda base環(huán)境下, 兩者的python3 地址是不一樣的。anaconda 激活環(huán)境后,是會(huì)在終端前面看到類似這種 " (環(huán)境名) "

Channel 管理
Conda channels 是 軟件存儲(chǔ)的位置,相當(dāng)于遠(yuǎn)程軟件倉庫。每次conda 軟件下載時(shí),都會(huì)從遠(yuǎn)程channel尋找相應(yīng)的軟件。比如bioconda ,一個(gè)專門存放生信軟件的channel。
默認(rèn)遠(yuǎn)程channel都在國外服務(wù)器。很多時(shí)候,我們下載安裝軟件都很慢。所以,我們可能需要修改下默認(rèn)的channel設(shè)置,指向國內(nèi)。
Channel 查看
$ conda config --show channels
channels:
- defaults
Channel 添加
$ conda config --add channels bioconda
$ conda config --add channels conda-forge
對(duì)于官方的channel, 添加channel 名就可以了。若是添加鏡像channel 需要提供URL
$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
查看添加的channels:
$ conda config --get channels
--add channels 'defaults' # lowest priority
--add channels 'bioconda'
--add channels 'conda-forge'
--add channels 'https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/' # highest priority
后添加的channel 有更高的優(yōu)先級(jí), 即在檢索軟件時(shí),會(huì)優(yōu)先檢索更高優(yōu)先級(jí)的channel.
清華鏡像
上面一個(gè)一個(gè)添加,有點(diǎn)麻煩,我們就直接使用清華鏡像站的提供的channel配置。
打開 ~/.condarc 文件,沒有就創(chuàng)建一個(gè)。添加下面的內(nèi)容。
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
然后運(yùn)行下清除索引緩存,保證用的是鏡像站提供的索引。
conda clean -i
環(huán)境管理
base 環(huán)境,建議不要隨意的安裝程序了??梢愿鶕?jù)日常需要?jiǎng)?chuàng)建一些特定的環(huán)境來安裝程序。我平常一些組學(xué)的的軟件都會(huì)安裝到了ngs這個(gè)環(huán)境中。 運(yùn)行R ,我創(chuàng)建了兩個(gè)環(huán)境 R4 和R41 分別用于R 4.0 和 R 4.1 的R軟件運(yùn)行。(其實(shí)之前還有個(gè)叫R 環(huán)境,被搞壞了,就刪了。)
環(huán)境創(chuàng)建
創(chuàng)建一個(gè)叫test 的環(huán)境
### -n 環(huán)境名
$ conda create -n test
激活/退出環(huán)境
$ conda activate test
$ conda deactivate

環(huán)境克隆
環(huán)境克隆,就復(fù)制一個(gè)環(huán)境,做個(gè)備份。在安裝了許多軟件后,可以考慮備份一下環(huán)境。因?yàn)榄h(huán)境使用久了,軟件安裝的越來越多,指不定哪個(gè)時(shí)候因?yàn)槟承┎僮?,軟件安裝就把當(dāng)前環(huán)境弄出問題了。有個(gè)備份還是好的,避免重新安裝。
你也可以把它當(dāng)作環(huán)境的重命名。在刪除老環(huán)境后。
克隆test 環(huán)境為ngs 環(huán)境
$ conda create -n ngs --clone test
刪除環(huán)境
$ conda remove -n test --all
查看環(huán)境
$ conda env list
# conda environments:
#
base * /home/user/anaconda3
ngs /home/user/anaconda3/envs/ngs
軟件管理
可用安裝軟件查找
不是每個(gè)軟件用conda 都能下載安裝的。所以用conda安裝軟件前,應(yīng)該檢索下該軟件是否能被conda 安裝。
我們可以直接在搜索引擎 搜索 conda 軟件名,比如要安裝bedtools:

一般,能搜到,代表可以安裝的。
還可以通過conda 命令搜索。
conda search bedtools -c bioconda

相比命令行,瀏覽器,可能更加智能一點(diǎn), 對(duì)錯(cuò)誤的輸入有一定魯棒性。
軟件安裝
要是用瀏覽器搜索的話,打開第一個(gè)鏈接, 打開的頁面就有安裝命令
### 在ngs環(huán)境下安裝使用
conda activate ngs
### -y 確認(rèn)安裝
### -c 選擇額外通道bioconda
$ conda install -y -c bioconda bedtools
安裝指定版本
conda install -y -c bioconda bedtools=2.30.0
安裝后,我們可以簡單確認(rèn)下是否正確的安裝
$ which bedtools
/home/user/anaconda3/envs/ngs/bin/bedtools
新創(chuàng)建的環(huán)境,都在 envs/目錄下
查看已安裝軟件
$ conda list
# packages in environment at /home/user/anaconda3/envs/ngs:
#
# Name Version Build Channel
_libgcc_mutex 0.1 main defaults
_openmp_mutex 4.5 1_gnu defaults
bedtools 2.30.0 h7d7f7ad_1 bioconda
bzip2 1.0.8 h7b6447c_0 defaults
libgcc-ng 9.3.0 h5101ec6_17 defaults
libgomp 9.3.0 h5101ec6_17 defaults
libstdcxx-ng 9.3.0 hd4cf53a_17 defaults
xz 5.2.5 h7b6447c_0 defaults
zlib 1.2.11 h7b6447c_3 defaults
軟件更新
conda update bedtools
軟件刪除
$ conda remove bedtools
#### 之后會(huì)提示是否確認(rèn)刪除。輸入y就好了
Conda 加速
conda有時(shí)使用時(shí)會(huì)發(fā)現(xiàn)很慢的。這里提供一些方案供參考:
鏡像設(shè)置
我猜國內(nèi)用戶,使用conda 慢的的原因,大部分是因?yàn)榫W(wǎng)絡(luò)問題吧, 參考上面Channel管理,設(shè)置下channel鏡像。
channel管理
channel 是 軟件存儲(chǔ)的位置。而conda 安裝軟件時(shí),會(huì)從已設(shè)置的channel 里尋找軟件。不同的通道可能有相同的包。 有多少個(gè)channel,它去多少個(gè)channel里尋找軟件。
不任意添加channel
舉個(gè)例子,在查詢requests時(shí),conda只會(huì)查詢當(dāng)前設(shè)置的channel。當(dāng)我們?cè)偬砑右粋€(gè)channel時(shí),conda就會(huì)查詢添加的。
$ conda search requests
Loading channels: done
# Name Version Build Channel
requests 2.18.4 py27hc5b0589_1 anaconda/pkgs/main
requests 2.18.4 py35hb9e6ad1_1 anaconda/pkgs/main
requests 2.18.4 py36he2e5f8d_1 anaconda/pkgs/main
requests 2.19.1 py27_0 anaconda/pkgs/main
requests 2.19.1 py35_0 anaconda/pkgs/main
requests 2.19.1 py36_0 anaconda/pkgs/main
## 添加一個(gè)channel, 測試完這個(gè),我就把這個(gè)channel從~/.condarc里刪除了
$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
$ conda search requests
Loading channels: done
# Name Version Build Channel
requests 2.9.2 py27_0 conda-forge
requests 2.9.2 py34_0 conda-forge
......
requests 2.18.4 py27hc5b0589_1 anaconda/pkgs/main
requests 2.18.4 py35_0 conda-forge
requests 2.18.4 py35_1 conda-forge
requests 2.18.4 py35hb9e6ad1_1 anaconda/pkgs/main
requests 2.18.4 py36_0 conda-forge
requests 2.18.4 py36_1 conda-forge
requests 2.18.4 py36he2e5f8d_1 anaconda/pkgs/main
所以因此,我們?nèi)菀紫氲?,不要隨意的添加channel, 因?yàn)樘砑拥脑蕉唷onda需要查詢的channel 就越多,導(dǎo)致
速度變慢。添加鏡像時(shí),添加幾個(gè)速度快的,核心的,包含常用的軟件的安裝的channel。就行了。
指定channel
除了添加channel 外,我們也可以在命令行指定某個(gè)channel。
$ conda search r-rsqlite
Loading channels: done
# Name Version Build Channel
r-rsqlite 1.0.0 r3.1.3_0 anaconda/pkgs/r
r-rsqlite 1.0.0 r3.1.3_0a anaconda/pkgs/r
r-rsqlite 1.0.0 r3.2.0_1 anaconda/pkgs/r
r-rsqlite 1.0.0 r3.2.0_1a anaconda/pkgs/r
$ conda search r-rsqlite -c conda-forge
Loading channels: done
# Name Version Build Channel
r-rsqlite 1.0.0 r3.1.3_0 anaconda/pkgs/r
r-rsqlite 1.0.0 r3.1.3_0a anaconda/pkgs/r
....
r-rsqlite 1.0.0 r3.3.1_2 anaconda/pkgs/r
r-rsqlite 1.1_1 r3.3.1_0 anaconda/pkgs/r
r-rsqlite 1.1_1 r3.3.2_0 anaconda/pkgs/r
r-rsqlite 1.1_2 r3.3.2_0 conda-forge
r-rsqlite 1.1_2 r3.4.1_0 conda-forge
$ conda search r-rsqlite -c conda-forge --override-channels
Loading channels: done
# Name Version Build Channel
r-rsqlite 1.1_2 r3.3.2_0 conda-forge
r-rsqlite 1.1_2 r3.4.1_0 conda-forge
r-rsqlite 2.0 r3.3.2_0 conda-forge
r-rsqlite 2.0 r3.4.1_0 conda-forge
r-rsqlite 2.0 r341hfc679d8_1 conda-forge
r-rsqlite 2.1.1 r341h9d2a408_0 conda-forge
-c/--channel 是添加額外查詢軟件的channel, 并不是指定查詢channel。 若要指定為查詢channel 可以再添加個(gè)參數(shù)--override-channels
設(shè)置channel 優(yōu)先級(jí)
不同的通道可能有相同的包, 而conda 需要解決不同通道相同包的沖突問題。所以conda 查詢channel 時(shí)有個(gè)優(yōu)先級(jí)的概念。
$ conda config --describe channel_priority
# # channel_priority (ChannelPriority)
# # Accepts values of 'strict', 'flexible', and 'disabled'. The default
# # value is 'flexible'. With strict channel priority, packages in lower
# # priority channels are not considered if a package with the same name
# # appears in a higher priority channel. With flexible channel priority,
# # the solver may reach into lower priority channels to fulfill
# # dependencies, rather than raising an unsatisfiable error. With channel
# # priority disabled, package version takes precedence, and the
# # configured priority of channels is used only to break ties. In
# # previous versions of conda, this parameter was configured as either
# # True or False. True is now an alias to 'flexible'.
# #
# channel_priority: flexible
設(shè)置channel priority 為 strict, 對(duì)于相同軟件名,只會(huì)考慮最高優(yōu)先級(jí)的channel。Conda 4.6.0 開始有了strict 特性。strict 的通道優(yōu)先級(jí)可以顯著加快 conda 操作并減少包不兼容問題。 官方建議將其作為默認(rèn)設(shè)置。但是,它可能會(huì)破壞舊的環(huán)境文件。所以可能在Conda 5.0 時(shí), 官方可能計(jì)劃將其設(shè)置為 conda 的默認(rèn)設(shè)置。
現(xiàn)在的話, 對(duì)于才開始用conda 的同學(xué)來說,可以考慮設(shè)為strict
$ conda config --set channel_priority strict
使用Mamba
Mamba 使用C++對(duì)conda 的重實(shí)現(xiàn):
- 支持并行下載,對(duì)包文件多線程處理
- 用libsolv 來更快的解決軟件依賴關(guān)系
- C++ 實(shí)現(xiàn)軟件核心功能,來獲取更大效率
mamba 用法和conda 一樣。除了 激活/退出環(huán)境,需要用 conda 外。其余一樣。
mamba 安裝
$ conda install mamba -n base -c conda-forge
其他
指定軟件版本
在安裝軟件時(shí),指定版本號(hào)安裝。
$ conda install bedtools=2.30.0 -c bioconda
新環(huán)境安裝軟件
創(chuàng)建一個(gè)新的環(huán)境,來安裝軟件。
參考
https://zh.wikipedia.org/wiki/Anaconda_(Python%E5%8F%91%E8%A1%8C%E7%89%88)#cite_note-2
https://docs.conda.io/projects/conda/en/latest/
http://www.itdecent.cn/p/edaa744ea47d
https://www.anaconda.com/blog/understanding-and-improving-condas-performance