1.為什么創建虛擬環境?
和其他大多數現代編程語言一樣,Python對包和模塊的下載、存儲以及管理有其自己的一套方法,Python的包一般都存在幾個特定的地方,大部分系統包會存在sys.prefix指定的路徑下;大部分第三方包,比如easy_install或pip會將包存放在site-packages所指定的路徑下。
Python應用程序通常會使用不在標准庫內的軟件包和模塊,應用程序有時需要特定版本的庫,由於Python導入模塊不能區分模塊版本,這意味着一個Python安裝可能無法滿足每個應用程序的要求。當我們同時開發多個工程時,不同的工程會將第三方的包存放在相同的路徑下。如果有兩個工程依賴同一個包,但是所需要的版本卻不一樣,例如應用程序A需要特定模塊的1.0版本但應用程序B需要2.0版本,由於Python無法根據版本來區分包的安裝路徑,所以這里就會發生版本沖突,安裝版本1.0或2.0將導致某一個應用程序無法運行。
這個問題的解決方案是創建一個虛擬環境(virtual environment),一個目錄樹,其中安裝有特定Python版本以及許多其他包,然后不同的應用將可以使用不同的虛擬環境,從而解決需求相沖突。應用程序 A 可以擁有自己的 安裝了 1.0 版本的虛擬環境,而應用程序 B 則擁有安裝了 2.0 版本的另一個虛擬環境。 如果應用程序 B 要求將某個庫升級到 3.0 版本,也不會影響應用程序 A 的環境。使用虛擬環境的另一個好處是:保持開發環境的簡潔、有序。
如果還沒理解怎么辦?結合具體場景再理解一遍
在實際項目開發中,我們通常會根據自己的需求去下載各種相應的框架庫,如Flask,Django,Scrapy,Beautiful Soup等,但是可能每個項目使用的框架庫並不一樣,或使用框架的版本不一樣,這樣需要我們根據需求不斷的更新或卸載相應的庫。這樣的Python環境操作會給開發環境和項目造成很多不必要的麻煩,管理也相當混亂。
具體場景1:假設兩個Python項目A和B,這兩個項目都需要使用同一個第三方模塊tensorflow。如果這兩個項目使用相同的tensorflow版本,也許不會有什么問題。但是,當A和B項目使用不同的tensorflow版本時即A使用tensorflow 0.70版本;B使用tensorflow 0.80版本。由於Python導入模塊不能區分模塊版本,導致項目A和項目B不能使用tensorflow的不同版本。
具體場景2:項目安裝Flask框架flask-0.10.1版本,命令行輸入sudo pip install flask==0.10.1,會將flask-0.10.1安裝到/usr/local/lib/python3.5/dist-packages路徑下;如果在一台電腦上,想開發多個不同的項目, 需要用到同一個包的不同版本, 如果使用上面的命令, 在同一個目錄下安裝或者更新, 新版本會覆蓋以前的版本, 其它之前的項目就無法運行了。
2.什么是虛擬環境?
虛擬環境是用於依賴項目管理和項目隔離的Python工具,允許Python站點包(第三方庫)安裝在本地特定項目的隔離目錄中,而不是全局安裝(即作為系統范圍內的Python的一部分)。即Python虛擬環境的主要目的是為了給不同的工程創建互相獨立的運行環境。虛擬環境可以搭建獨立的Python運行環境,使得單個項目的運行環境與其他項目互不影響,每一個工程都有自己的依賴包。並且,虛擬環境的數量沒有限制,我們可以輕松地用virtualenv或者pyenv等工具來創建多個虛擬環境。
白話:python中通過虛擬化出來一個空間,從電腦獨立開辟出來的環境,與主環境完全隔離。通俗的來講,虛擬環境就是借助虛擬機docker來把一部分內容獨立出來,我們把這部分獨立出來的東西稱作“容器”,在這個容器中,我們可以只安裝我們需要的依賴包,各個容器之間互相隔離,互不影響。避免項目中對於環境要求,造成的插件版本混亂。
簡單概括:
概念:一個獨立的局部的 Python 環境;完全模擬系統全局 Python 環境的使用,如安裝、卸載包到邏輯操作等
作用:讓項目運行在一個獨立的局部的 Python 環境中,使采用不同環境的項目互不干擾。
3.搭建虛擬環境的過程和常見的使用方法
1).安裝virtualenv軟件包
前提必須安裝好python環境,並檢查電腦系統環境path是否有python路徑,使用虛擬環境需要借助virtualenv或pyvenv,(其中pyvenv是較新的工具,和virtualenv的使用方法類似),它們的使用非常簡單。這里主要講解virtualenv,virtualenv 是一個創建隔絕的Python環境的工具,首先安裝virtualenv(如果使用Python 3,它自動默認安裝了pyvenv)。
1 pip install virtualenv
它會默認安裝到你的python庫文件lib中,可以看安裝完成的地址,里面給出了安裝之后的庫地址
2).創建虛擬環境(virtualenv基本使用)
(1). 通過上面的步驟安裝成功之后,首先確定好要放置虛擬環境的目錄(我一般習慣在項目當中建立一個目錄用來存放給這個項目使用的虛擬環境),然后進入你想要創建python虛擬環境的目錄下,沒有合適的就創建一個空文件夾即可:
1 mkdir filename # 可以新建一個名為filename的空文件夾,用來存放即將創建的虛擬環境 2 cd filename # 進入到這個空文件夾下
(2). cd 到存放虛擬環境的的地址,就可以創建虛擬環境了,執行下面的命令會在當前所在目錄進行創建(若省略名字將會把文件均放在當前目錄):
1 virtualenv envname # venvname為虛擬環境目錄名,目錄名自定義
(3). 創建虛擬環境時可以加上版本號指定 Python 版本,不然默認系統全局下的 Python 環境:(Linux系統下是Python2的虛擬環境,Windows系統下是自己安裝好的系統全局python版本,如果系統上有多個版本的 Python,您以通過運行 python3
或您想要的任何版本來選擇特定的Python版本)
1 virtualenv -p python3 test_env1 # -p參數 指定Python解釋器程序 2 3 virtualenv -p /usr/local/bin/python3.5 test_env2 # -p參數 指定Python解釋器程序(路徑)
(4). 創建虛擬環境時可以繼承系統三方庫 ,添加參數--system-site-packages
,即項目檢索庫的時候,也會到系統的三方庫中找,不添加時,默認只到虛擬環境中查找庫:
1 virtualenv --system-site-packages envmane
【補充】:虛擬環境到底長啥樣?執行virtualenv envname命令之后,就會在當前的目錄中創建一個文件夾,並在其中創建包含Python解釋器,標准庫和各種支持文件的副本的目錄,生成如下的目錄結構:(Linux或Mac系統下)
1 ├──bin 2 │ ├──activate 3 │ ├──activate.csh 4 │ ├──activate.fish 5 │ ├──easy_install 6 │ ├──easy_install-3.5 7 │ ├──pip 8 │ ├──pip3 9 │ ├──pip3.5 10 │ ├──python->python3.5 11 │ ├──python3->python3.5 12 │ └──python3.5->/opt/local/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 13 ├──include 14 ├──lib 15 │ └──python3.5 16 │ └──site-packages 17 └──pyvenv.cfg
bin: 用於管理虛擬環境的文件,bin目錄下有一個重要的腳本文件activate,這個腳本就是用來將其所在的虛擬環境設置為當前Python的運行環境
include: 編譯Python包時所需要的C頭文件
lib: Python自帶及第三方的庫這其中還包含有一些Python的工具和可執行文件等副本。這些文件用來保證Python代碼可以獨立於系統環境而運行。
【注意】:1.上面的結構是在Linux或Mac系統下,這里的bin目錄在Windows系統下叫Scripts目錄;
2.Windows與 Mac 不同的是,虛擬環境的 bin 目錄下只有 activate 腳本,沒有 deactivate 腳本。
3). 激活虛擬環境
首先確保cd到存放虛擬環境文件夾目錄下,選擇要激活的虛擬環境(例如選擇envname):
1 envname\Scripts\activate # 在Windows上 2 3 source envname/bin/activate # 在Unix或MacOS上
(這個腳本是為bash shell編寫的,如果使用 csh 或 fish shell,則應該改用 activate.csh
或 activate.fish
腳本)。進入之后就可以通過pip 命令安裝、升級和移除各種需要的框架依賴包和軟件包了,此時使用pip安裝的包都將會放在 已激活的這個虛擬環境文件夾中,與全局安裝的Python隔離開。
4). 退出虛擬環境
在激活的虛擬環境中,執行命令 deactivate:
1 deactivate
執行完上面的代碼,將會回到系統默認的Python解釋器,包括已安裝的庫也會回到默認的。即我們的shell提示符回歸到了正常狀態,同時Python的環境也切換到了全局的系統環境。
5). 刪除虛擬環境
直接刪除虛擬環境所在目錄即可:
1 rm -rf venvname
4.虛擬環境的配置(統一管理虛擬環境)
通過上面的步驟其實已經完成虛擬環境virtualenv的安裝和使用了,虛擬環境的引入解決了我們關於環境沖突的問題,但是它同時也帶來了一個問題,就是虛擬環境過多所帶來的管理問題,它需要我們記住每一個虛擬環境的目錄,才能進入虛擬環境並操作,因此這里的virtualenv不是最完美的,因為virtual的啟動、停止腳本都在特定文件夾,可能一段時間后,就會有很多個虛擬環境散落在系統各處,很難再記住它們的名字或者位置。
鑒於virtualenv不便於對虛擬環境集中管理,所以推薦直接使用virtualenvwrapper,virtualenvwrapper就是專門用來解決虛擬環境管理問題的一個工具,它提供了一系列命令使得虛擬環境工作變得便利,它把你所有的虛擬環境都放在一個地方,我們可以很方便地用它來實現對虛擬環境的創建,刪除,拷貝,並且可以輕松地在不同環境間進行切換。
1). 安裝virtualenvwrapper(確保virtualenv已安裝)
1 pip install virtualenvwrapper # Linux和Mac系統 2 pip install virtualenvwrapper-win # Windows使用該命令
2). 配置環境變量
(1). 為什么配置虛擬環境?安裝完virtualenvwrapper之后,此時mkvirtualenv這個命令還不可以直接使用,原因是我們還沒有配置虛擬環境的環境變量,包括workon我們也無法使用。拿Linux系統舉例,當安裝第三方包的時候,會先source一下virtualenvwrapper.sh這個文件(執行腳本文件的意思),因為mkvirtualenv指令是在virtualenvwrapper.sh這個文件里面,也就是執行virtualenvwrapper.sh這個文件的時候,才可以運行像mkvirtualenv這樣的指令;所以把source /usr/local/bin/virtualenvwrapper.sh 這段代碼添加到一個文件里面,每次只要打開這個文件,就會執行。
(2). 查看一下virtualenvwrapper.sh的路徑:
1 which virtualenvwrapper.sh # 假設路徑為/usr/local/bin/virtualenvwrapper.sh
(3). Linux或Mac系統下配置:
1 # 1、在~(家目錄)下創建目錄用來存放虛擬環境(有就不用) 2 mkdir .virtualenvs 3 4 vim ~/.bashrc # 打開.bashrc配置文件 5 6 # 添加如下內容: 7 export WORKON_HOME=$HOME/.virtualenvs # virtualenvwrapper存放虛擬環境目錄 8 source /usr/local/bin/virtualenvwrapper.sh # virtrualenvwrapper會安裝到python的bin目錄下,該路徑是python安裝目錄下bin/virtualenvwrapper.sh 9 10 source ~/.bashrc # 讀入配置文件,立即生效
此時創建虛擬環境時所有的虛擬環境都位於/home/下的隱藏目錄.virtualenvs下;創建虛擬環境需要聯網;創建成功后, 會自動工作在這個虛擬環境上;工作在虛擬環境上, 提示符最前面會出現 “虛擬環境名稱”。
如果~/.bashrc里面的內容改為export WORKON_HOME=~/Envsname,這樣會在WORKON_HOME變量指定的目錄下新建名為Eenvsname的虛擬環境。
(4). Windows系統下配置:
給虛擬環境安裝目錄設置一個專門的目錄,Windows系統下安裝完virtualenvwrapper-win,再創建虛擬環境時,會默認放在C:\Users\電腦用戶名\Envs目錄中。
如果這樣滿足不了我們的需求,我們想把項目放在其他盤(或其他位置),就需要我們自己配置一下環境路徑,通過設置WORKON_HOME路徑,給我們的python虛擬環境指定一個存放位置:
> 新建要存一個自己想要放虛擬環境的文件夾:例如 D:\codeworkpace\python\envs
> 配置電腦系統環境變量,->新建系統變量 -> 變量名:WORKON_HOME ->指定路徑:D:\codeworkpace\python\envs
配置完環境變量就會在WORKON_HOME所在的路徑下創建集中存放虛擬環境的目錄了。
3). virtualenvwrapper基本使用指令
1 mkcirtualenv 虛擬環境名稱 # 創建虛擬環境 2 3 workon # 查看當前的虛擬環境目錄(列出所有虛擬環境列表) 4 5 workon 虛擬環境名稱 # 切換到指定虛擬環境(進入虛擬環境) 6 7 deactivate # 退出虛擬環境 8 9 rmvirtualenv 虛擬環境名 # 刪除虛擬環境(先退出再刪除) 10 11 which python # 查看虛擬環境的python的路徑
5.conda虛擬環境操作
1 conda create -n xxxx python=3.5 # 創建指定python版本的xxxx虛擬環境: 2 3 conda activate xxxx # 進入xxxx環境 4 5 conda deactivate # 退出(關閉環境) 6 7 conda remove -n your_env_name(虛擬環境名稱) --all # 刪除虛擬環境 8 9 conda remove --name your_env_name package_name # 刪除虛擬環境中的某個包 10 11 # 查看已安裝環境(顯示所有的虛擬環境,conda默認(自帶)有一個base環境) 12 conda info –e 13 conda info –envs 14 conda env list
【注意】:conda離線創建環境時:需要將錯誤信息里有一項是offline mode:false 改為 offline mode:true ,不然創建不成功
1 conda config --set offline true
【補充】:安裝時可能出現的bug
1). anaconda裝環境遇到無法定位程序輸入點OPENSSL_sk_new_reserve……問題:首先進入Anaconda\DLLS目錄,查看libssl-1_1-x64.dll的日期;然后進入Anaconda\Library\bin目錄,比較兩者日期;如果不一致,將DLLS中的替換到bin中的;最后再執行conda create -n xxxx python=3.5
即可。
2). anaconda出現CondaHTTPError問題:CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.continuum.io/pkgs/free/noarch/repodata.json.bz2> (一般是設置代理的問題)
最后補充倆指令:
查看虛擬環境中安裝的包:pip freeze 或 pip list
查看文件里面的內容,例如requirements.txt文件:cat requirements.txt