如何在Python中創(chuàng)建和使用虛擬環(huán)境
前兩天收到公司郵件,說在我的電腦上發(fā)現(xiàn)了anaconda的進(jìn)程,商業(yè)軟件需要付費(fèi),為了軟件合規(guī),讓我卸載掉。我就借這個機(jī)會寫個簡單的教程。
Anaconda是一個Python的發(fā)行版 ,主要集中在科學(xué)計(jì)算的用途上,主要有三點(diǎn)優(yōu)勢:
- 打包了很多科學(xué)計(jì)算的常用庫,比如numpy
- 開發(fā)了conda這個環(huán)境管理工具,可以很方便地創(chuàng)建虛擬環(huán)境,管理多個Python版本,同時安裝conda維護(hù)的庫
- 維護(hù)了很多科學(xué)計(jì)算相關(guān)的庫,而且都是編譯好的二進(jìn)制庫,相比于pip的庫,有時候更加方便,比如conda會幫你把很多c語言的庫編譯好直接裝,很省事
我上網(wǎng)搜了一下,Anaconda確實(shí)變更了他們的授權(quán)政策,之前個人版可以用作商業(yè)用途,現(xiàn)在不行了。大規(guī)模商業(yè)公司的用戶必須得繳費(fèi),小規(guī)模的商業(yè)用途仍然可以使用個人版(200人以下)。
我估摸著這個公司其實(shí)查的也沒有那么嚴(yán),屬于睜一只眼閉一只眼,甚至是睜一只眼閉九只眼的狀態(tài),但是公司為了完全合規(guī)還是讓我們卸載掉了這個軟件。
(話說為什么不能出錢給我們買?)
其實(shí)Anaconda倒不是因?yàn)檐浖召M(fèi),他收費(fèi)的主要對象是conda包的在線服務(wù),也就是你從他們的服務(wù)器上下載庫的話收費(fèi),單單使用conda這個軟件并不收費(fèi)。
然而,我用conda的場景偏偏就需要從他們的服務(wù)器上下載包,因?yàn)槲抑饕褪枪芾矶鄠€python版本,這個是需要下載二進(jìn)制文件的。
所以,雖然但是,我還是在不舍中卸載了,然后開始尋找替代方案。
結(jié)論是:
- 如果只需要使用一個版本的Python,但是需要多個虛擬環(huán)境,用venv
- 如果需要用到多個版本的Python和虛擬環(huán)境,并且可以方便來回切換,用pyenv
Python中的虛擬環(huán)境是一個很有用的功能,可以建立多個互不干擾的空間,每個空間中安裝的包都是相互獨(dú)立的。之所以有這個需求,是因?yàn)椴煌能浖蕾嚨陌陌姹臼遣灰粯拥摹?/p>
比如,你有一套源代碼依賴TensorFlow 1.0和python3.5,然后你又下載了別人的源代碼,依賴TensorFlow 2.0和python3.6,如果沒有虛擬環(huán)境就很麻煩,因?yàn)镻ython不能安裝不同版本的庫到同一個環(huán)境中。但是你可以創(chuàng)建兩個不同的Python環(huán)境,這個時候就能完美運(yùn)行兩套代碼,互不干涉了。
下面稍微寫一下conda pyenv venv的基本使用教程。
conda
用conda創(chuàng)建虛擬環(huán)境的命令如下
conda create -n new_env python=3.8 numpy
其中-n new_env的意思是指定新環(huán)境的名字,這里叫new_env,python=3.8是指定python的版本,numpy是指創(chuàng)建環(huán)境的時候你想安裝的包,可以寫不止一個,也可以不寫,等到創(chuàng)建完成了再安裝。
創(chuàng)建完成之后,你可以通過conda activate來激活某個環(huán)境
conda activate new_env
conda的環(huán)境默認(rèn)都是安裝在anaconda的根目錄下面,比如我的anaconda安裝在/home/user/anaconda下,那么剛剛的環(huán)境就在home/user/anaconda/envs/new_env中
conda的優(yōu)勢在于,可以選擇python版本,而且不管是不同版本的Python解釋器,還是對應(yīng)的包,他提供都是編譯好的二進(jìn)制文件,下載下來就可以直接用,不用自己編譯。用pyenv也能管理多個版本,但是需要自己編譯,雖然自己編譯更自由,但是也需要更多技巧。
conda的缺點(diǎn)是,依賴計(jì)算很慢,所以安裝會更久,而且網(wǎng)絡(luò)對國內(nèi)用戶不太友好。
venv
venv的用法很簡單
python3 -m venv my-env
這樣就創(chuàng)建完成了一個新虛擬環(huán)境,叫my-env,跟conda不同的是,這個my-env是放在你運(yùn)行這條命令的目錄下面。
創(chuàng)建完成之后,還需要激活,運(yùn)行下面的命令激活
source my-env/bin/activate
venv的局限性在于,只能用當(dāng)前的Python版本
pyenv
pyenv可以用來管理多個python環(huán)境,用起來比conda稍微復(fù)雜一點(diǎn)點(diǎn)。
麻煩在哪呢?它需要下載Python的源代碼自己編譯,而conda都是下載好的二進(jìn)制,可以直接用。我用pyenv安裝python3.6的時候就遇到了編譯錯誤,然后設(shè)置了build flag才解決。
安裝某個版本:pyenv install 3.6.15
設(shè)置默認(rèn)版本:pyenv global 3.6.15
裝完之后就能再配合venv創(chuàng)建虛擬環(huán)境了。
pyenv其實(shí)自帶了一個virtualenv命令,類似于conda,可以在創(chuàng)建虛擬環(huán)境的時候指定版本,比如
pyenv virtualenv 3.6.15 new_env
但是需要你先安裝對應(yīng)版本的python。
以上基本上就涵蓋了Python創(chuàng)建和使用虛擬環(huán)境的幾種方法。