在實(shí)際中,更為流行的是用Conda來(lái)管理Python環(huán)境。今天這篇文章就為大家介紹這方面的相關(guān)內(nèi)容。
Conda環(huán)境
Conda簡(jiǎn)介
Conda是目前為止,最流行的Python軟件包與管理環(huán)境。Conda分為 miniconda 與 anaconda兩種。前者從名字上就能猜出是精簡(jiǎn)版,后者預(yù)裝了很多常用的功能,但比較臃腫。實(shí)際工程中,一般都使用 miniconda,按需安裝軟件包,本文的下面篇幅也以 miniconda 為例進(jìn)行說(shuō)明。
Conda安裝
首先利用wget下載安裝腳本文件:
wget https://repo.continuum.io/miniconda/Miniconda3-latest-linux-x86_64.sh
如果速度較慢,可以換用axel或aria2c下載
利用chmod命令修改sh文件為可執(zhí)行文件,然后運(yùn)行安裝腳本:
chmod 755 Miniconda3-latest-Linux-x86_64.sh bash ./Miniconda3-latest-Linux-x86_64.sh
在出現(xiàn)的提示界面中,根據(jù)提示選擇yes或no。一般來(lái)說(shuō),我們保持默認(rèn)即可,但需要留意下最后一步會(huì)自動(dòng)在.bashrc文件添加conda的PATH路徑。如果conda的環(huán)境存在與你日常使用的程序有沖突的命令,就有可能會(huì)出現(xiàn)問(wèn)題。
當(dāng)然,還有一種方式是在添加PATH路徑時(shí)選擇no,然后在每次需要conda的時(shí)候手動(dòng)找到conda下的active命令激活下。這種方式比較靈活,如果不嫌麻煩建議使用這種方式。
注意不要把激活conda與激活虛擬環(huán)境搞混。
Conda常用命令
在conda環(huán)境中,常用的命令格式為:
conda [命令 [參數(shù)]]
包管理
與python -m pip list類似,conda可以列出當(dāng)前環(huán)境下的所有包:
conda list
版本與升級(jí)
conda有一套特別的機(jī)制,用于管理和維護(hù)依賴庫(kù)之間的關(guān)系。在不同版本的conda中,我們可以直接使用的Python與依賴庫(kù)的版本都不同,為了確定當(dāng)前使用的conda版本,可以運(yùn)行以下命令:
conda --version
有時(shí),我們想用的某個(gè)庫(kù)在conda中有問(wèn)題,或者默認(rèn)模塊安裝的版本比較舊,可以先嘗試升級(jí)解決:
conda update conda
環(huán)境管理
conda環(huán)境中的虛擬環(huán)境比起原生Python更為強(qiáng)大,可以指定Python的版本,并自動(dòng)安裝相關(guān)的C++依賴庫(kù)(windows下自動(dòng)下載相關(guān)的c++ runtime)。
- 建立
建立虛擬環(huán)境命令:
conda create -n env_demo
如果要指定python版本,同時(shí)指定虛擬環(huán)境生成的路徑,可以這樣:
conda create python=3.6 -p /tmp/test
這樣,Conda就為你生成了一個(gè)在/tmp/下叫test的虛擬環(huán)境,并且環(huán)境里的python版本是3.6。
conda create默認(rèn)并不會(huì)把基礎(chǔ)環(huán)境的依賴復(fù)制給新建的虛擬環(huán)境。如果要實(shí)現(xiàn)類似的依賴復(fù)制,需要加參數(shù)--clone,例如conda create -n test3 --clone base
我們也看一下這個(gè)路徑下的內(nèi)容:
ls /tmp/test bin conda-meta include lib share ssl
在bin目錄中,就存在python等常用的可執(zhí)行命令:
2to3 idle3 pydoc3 python3.6-config pyvenv-3.6 wish8.5 2to3-3.6 idle3.6 pydoc3.6 python3.6m sqlite3 xz c_rehash openssl python python3.6m-config tclsh8.5 easy_install pip python3 python3-config unxz easy_install-3.6 pydoc python3.6 pyvenv wheel
因?yàn)檫@里是虛擬環(huán)境的bin目錄,所以沒(méi)有conda、activate等命令。這些命令都在當(dāng)前conda默認(rèn)的bin目錄中。
- 激活
激活一個(gè)虛擬環(huán)境,就需要用bin下的activate:
conda activate /tmp/test
其中,/tmp/test是虛擬環(huán)境的路徑,可以從conda list中查看。
激活后,可以用which python確認(rèn)是否成功。如果成功,當(dāng)前python應(yīng)該指向的是/tmp/test/bin/python
- 安裝依賴
激活一個(gè)Conda的虛擬環(huán)境后,安裝依賴主要用以下命令:
conda install xxx
這條命令主要從默認(rèn)的頻道中去尋找xxx軟件包。比如,我們可以用conda install pandas來(lái)安裝pandas軟件包。要注意,Conda里有頻道的概念,類似電視機(jī)買(mǎi)回來(lái)一般都有個(gè)默認(rèn)頻道一樣,默認(rèn)的Conda有一個(gè)defaults的頻道。如果我們需要更多的下載源,就需要和加入U(xiǎn)buntu軟件源類似,加入Conda頻道:
conda config --add channels conda-forge
如果大家還記得上次文章,里面給大家介紹了Python的pip安裝時(shí)怎么配置鏡像地址來(lái)加速國(guó)內(nèi)下載速度。同樣的操作在Conda里面,則是通過(guò)配置頻道來(lái)實(shí)現(xiàn)。比如,我們添加清華的Conda鏡像:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
配置完成后,可以通過(guò)下面命令來(lái)確認(rèn)是否配置成功:
conda config --show
當(dāng)然,更直接的是直接下載一個(gè)依賴庫(kù),看實(shí)際下載速度怎么樣。另外,也可以在conda install的同時(shí),顯式的指定頻道:
conda install --prefix=/tmp/miniconda3/pyenv/py36 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ pytorch torchvision cuda91 -c pytorch
Conda不僅僅可以用conda install安裝軟件,同時(shí)也可以繼續(xù)用pip,就和普通Python環(huán)境下操作沒(méi)太有什么區(qū)別:
python -m pip install xxx
并不是所有的軟件都可以用pip安裝。最佳實(shí)踐是只在conda找不到包時(shí),才用pip安裝。不要使用user參數(shù),避免權(quán)限問(wèn)題。
- 退出
直接運(yùn)行conda deactivate,然后可以通過(guò)which python來(lái)確認(rèn)。
Conda環(huán)境導(dǎo)出與恢復(fù)
Conda支持直接導(dǎo)出環(huán)境,命令如下:
conda env export > env.yml
這里,推薦在熟悉的情況下,去掉二級(jí)依賴庫(kù)(依賴的依賴)。一方面減少文件內(nèi)容,第二有可能二級(jí)依賴在后面會(huì)被取消。
環(huán)境恢復(fù)使用命令:
conda env create -n revtest -f=/tmp/env.yml
這里比較關(guān)鍵是導(dǎo)出的yaml文件,通過(guò)編譯器查看可知,其是一個(gè)標(biāo)準(zhǔn)的yaml文件。里面主要包括:
name: 環(huán)境名字 channels: - 頻道urls …… dependencies: - 軟件名=版本號(hào)=編譯環(huán)境 prefix:環(huán)境路徑
- Conda環(huán)境包含pip依賴
私信小編01 領(lǐng)取完整項(xiàng)目!上面的環(huán)境依賴都是conda自己就可以安裝,如果所需要的依賴正好沒(méi)有conda資源怎么辦?其實(shí),conda早就可以直接在環(huán)境里使用pip依賴:
name: hyperparam_example channels: - defaults dependencies: - python=3.6 - numpy=1.14.3 - pandas=0.22.0 - scikit-learn=0.19.1 - matplotlib=2.2.2 - tensorflow-mkl==1.13.1 - keras==2.2.2 - pip: - mlflow>=1.0 - Gpy==1.9.2 - GpyOpt==1.2.5 - pyDOE==0.3.8 - hyperopt==0.1
這個(gè)環(huán)境文件參考自mlflow項(xiàng)目(https://github.com/mlflow/mlflow/blob/master/examples/hyperparam/conda.yaml),從這里我們就可以看到兩點(diǎn):
- 利用conda就可以同時(shí)管理好conda和pip依賴
- conda 的環(huán)境管理,已經(jīng)成為一種標(biāo)準(zhǔn),被mlflow這樣的項(xiàng)目所使用。
那么最后一個(gè)問(wèn)題,conda和pip到底有什么不同?
- conda還負(fù)責(zé)依賴檢查和維護(hù)。Conda不僅僅安裝Python庫(kù)這么簡(jiǎn)單,他還能把Python庫(kù)需要的外部依賴也同時(shí)安裝進(jìn)來(lái),并且維護(hù)每個(gè)軟件庫(kù)對(duì)應(yīng)的各種依賴版本關(guān)系,每次conda安裝都要進(jìn)行比較復(fù)雜的處理來(lái)維護(hù)好依賴關(guān)系。
- conda這個(gè)包管理命令不僅僅可以用在Python上,還可以用來(lái)管理R等其他語(yǔ)言。
- 不能提供egg或whl時(shí),pip只能從源代碼編譯。而conda install一直都是安裝編譯好的二進(jìn)制。
- conda默認(rèn)就支持虛擬環(huán)境;而pip是靠virtualenv或venv來(lái)支持
- conda是Python的外部工具
- conda的托管網(wǎng)站是Anaconda,而pip的托管網(wǎng)站是PyPI(https://pypi.org/)