11.21 conda:一個當下最流行的Python虛擬環境工具

在實際中,更為流行的是用Conda來管理Python環境。今天這篇文章就為大家介紹這方面的相關內容。


Conda環境

Conda簡介

Conda是目前為止,最流行的Python軟件包與管理環境。Conda分為 miniconda 與 anaconda兩種。前者從名字上就能猜出是精簡版,後者預裝了很多常用的功能,但比較臃腫。實際工程中,一般都使用 miniconda,按需安裝軟件包,本文的下面篇幅也以 miniconda 為例進行說明。

Conda安裝

首先利用wget下載安裝腳本文件:

wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh

如果速度較慢,可以換用axel或aria2c下載

利用chmod命令修改sh文件為可執行文件,然後運行安裝腳本:

chmod 755 Miniconda3-latest-Linux-x86_64.sh
bash ./Miniconda3-latest-Linux-x86_64.sh

在出現的提示界面中,根據提示選擇yes或no。一般來說,我們保持默認即可,但需要留意下最後一步會自動在.bashrc文件添加conda的PATH路徑。如果conda的環境存在與你日常使用的程序有衝突的命令,就有可能會出現問題。

當然,還有一種方式是在添加PATH路徑時選擇no,然後在每次需要conda的時候手動找到conda下的active命令激活下。這種方式比較靈活,如果不嫌麻煩建議使用這種方式。

注意不要把激活conda與激活虛擬環境搞混。

Conda常用命令

在conda環境中,常用的命令格式為:

conda [命令 [參數]] 

包管理

與python -m pip list類似,conda可以列出當前環境下的所有包:

conda list

版本與升級

conda有一套特別的機制,用於管理和維護依賴庫之間的關係。在不同版本的conda中,我們可以直接使用的Python與依賴庫的版本都不同,為了確定當前使用的conda版本,可以運行以下命令:

conda --version 

有時,我們想用的某個庫在conda中有問題,或者默認模塊安裝的版本比較舊,可以先嚐試升級解決:

conda update conda

環境管理

conda環境中的虛擬環境比起原生Python更為強大,可以指定Python的版本,並自動安裝相關的C++依賴庫(Windows下自動下載相關的c++ runtime)。

  • 建立

建立虛擬環境命令:

conda create -n env_demo 

如果要指定python版本,同時指定虛擬環境生成的路徑,可以這樣:

conda create python=3.6 -p /tmp/test

這樣,Conda就為你生成了一個在/tmp/下叫test的虛擬環境,並且環境裡的python版本是3.6。

conda create默認並不會把基礎環境的依賴複製給新建的虛擬環境。如果要實現類似的依賴複製,需要加參數--clone,例如conda create -n test3 --clone base

我們也看一下這個路徑下的內容:

ls /tmp/test
bin conda-meta include lib share ssl

在bin目錄中,就存在python等常用的可執行命令:

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

因為這裡是虛擬環境的bin目錄,所以沒有conda、activate等命令。這些命令都在當前conda默認的bin目錄中。

  • 激活

激活一個虛擬環境,就需要用bin下的activate:

conda activate /tmp/test

其中,/tmp/test是虛擬環境的路徑,可以從conda list中查看。

激活後,可以用which python確認是否成功。如果成功,當前python應該指向的是/tmp/test/bin/python

  • 安裝依賴

激活一個Conda的虛擬環境後,安裝依賴主要用以下命令:

conda install xxx

這條命令主要從默認的頻道中去尋找xxx軟件包。比如,我們可以用conda install pandas來安裝pandas軟件包。要注意,Conda裡有頻道的概念,類似電視機買回來一般都有個默認頻道一樣,默認的Conda有一個defaults的頻道。如果我們需要更多的下載源,就需要和加入Ubuntu軟件源類似,加入Conda頻道:

conda config --add channels conda-forge

如果大家還記得上次文章,裡面給大家介紹了Python的pip安裝時怎麼配置鏡像地址來加速國內下載速度。同樣的操作在Conda裡面,則是通過配置頻道來實現。比如,我們添加清華的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/

配置完成後,可以通過下面命令來確認是否配置成功:

conda config --show

當然,更直接的是直接下載一個依賴庫,看實際下載速度怎麼樣。另外,也可以在conda install的同時,顯式的指定頻道:

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安裝軟件,同時也可以繼續用pip,就和普通Python環境下操作沒太有什麼區別:

python -m pip install xxx

並不是所有的軟件都可以用pip安裝。最佳實踐是隻在conda找不到包時,才用pip安裝。不要使用user參數,避免權限問題。

  • 退出

直接運行conda deactivate,然後可以通過which python來確認。

Conda環境導出與恢復

Conda支持直接導出環境,命令如下:

conda env export > env.yml

這裡,推薦在熟悉的情況下,去掉二級依賴庫(依賴的依賴)。一方面減少文件內容,第二有可能二級依賴在後面會被取消。

環境恢復使用命令:

conda env create -n revtest -f=/tmp/env.yml

這裡比較關鍵是導出的yaml文件,通過編譯器查看可知,其是一個標準的yaml文件。裡面主要包括:

name: 環境名字
channels:
- 頻道urls
……
dependencies:
- 軟件名=版本號=編譯環境
prefix:環境路徑
  • Conda環境包含pip依賴

私信小編01 領取完整項目!上面的環境依賴都是conda自己就可以安裝,如果所需要的依賴正好沒有conda資源怎麼辦?其實,conda早就可以直接在環境裡使用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

這個環境文件參考自mlflow項目(https://github.com/mlflow/mlflow/blob/master/examples/hyperparam/conda.yaml),從這裡我們就可以看到兩點:

  • 利用conda就可以同時管理好conda和pip依賴
  • conda 的環境管理,已經成為一種標準,被mlflow這樣的項目所使用。

那麼最後一個問題,conda和pip到底有什麼不同?

  • conda還負責依賴檢查和維護。Conda不僅僅安裝Python庫這麼簡單,他還能把Python庫需要的外部依賴也同時安裝進來,並且維護每個軟件庫對應的各種依賴版本關係,每次conda安裝都要進行比較複雜的處理來維護好依賴關係。
  • conda這個包管理命令不僅僅可以用在Python上,還可以用來管理R等其他語言。
  • 不能提供egg或whl時,pip只能從源代碼編譯。而conda install一直都是安裝編譯好的二進制。
  • conda默認就支持虛擬環境;而pip是靠virtualenv或venv來支持
  • conda是Python的外部工具
  • conda的託管網站是Anaconda,而pip的託管網站是PyPI(https://pypi.org/)


分享到:


相關文章: