python 虚拟环境_理解Python虚拟环境
什么是環(huán)境
既然有所謂的 虛擬環(huán)境(Virtual Environment),那么首先有必要解釋一下,什么是環(huán)境。
這里的環(huán)境,指的就是 Python 代碼的運(yùn)行環(huán)境。它應(yīng)該包含以下信息:
- Python 解釋器,用哪個解釋器來執(zhí)行代碼?
- Python 庫的位置,該去哪里 import 所需要的模塊呢?
- 可執(zhí)行程序的位置,比如說安裝了 pip,那么 pip 命令是在哪里呢?
其中第 1 個是最主要的,后面 2 個基本是圍繞它確定的。
如果看了我在 安裝 Python 詳解 里對安裝后的文件夾的說明,應(yīng)該很清楚了,就是:
- python.exe
- Lib 文件夾,包括其中的 site-packages
- Scripts 文件夾
sys.path
當(dāng)我們說包的路徑就在 Lib 和 site-packages 文件夾里的時候,雖然大多數(shù)的情況下就是這樣的,但是實(shí)際上并不準(zhǔn)確。
包的搜尋路徑是通過 Python 系統(tǒng)中的一個變量決定的,也就是 sys.path,我們先來打印一下看看:
>>> import sys >>> from pprint import pprint >>> pprint(sys.path) ['', # 注意,別忽視了第 1 個'C:UsersDavyAppDataLocalProgramsPythonPython38python38.zip','C:UsersDavyAppDataLocalProgramsPythonPython38DLLs','C:UsersDavyAppDataLocalProgramsPythonPython38lib','C:UsersDavyAppDataLocalProgramsPythonPython38','C:UsersDavyAppDataRoamingPythonPython38site-packages','C:UsersDavyAppDataLocalProgramsPythonPython38libsite-packages'] >>>“ pprint 是內(nèi)置的 pretty-print 模塊,可以自動換行,讓打印結(jié)果好看一點(diǎn)。注意:第 1 項(xiàng)是一個空字符串,它代表的是當(dāng)前路徑,也就是你啟動程序的地方。比如說,我們默認(rèn)情況下進(jìn)入命令行就自動進(jìn)入到當(dāng)前用戶的目錄,例如 C:UsersDavy,那么當(dāng)前目錄就是這個。
如果你還感到疑惑,可以用下面的語句打印出絕對路徑:
>>> import os.path >>> os.path.abspath('') 'C:UsersDavy'除了第一項(xiàng),這個列表里最常用的就是最后一項(xiàng),這個在 Python 安裝詳解 中有過說明。
什么是虛擬環(huán)境
知道了什么是環(huán)境,再來理解什么是虛擬環(huán)境就非常容易了。
簡而言之,虛擬環(huán)境就是 Python 環(huán)境的一個副本。
要得到這么一個副本,首先:
- 要給它單獨(dú)找個文件夾存起來
- 要給它取個名字
這個文件夾的名字也就是這個虛擬環(huán)境的名字,在這個文件夾下面有這些東西:
- 一個 python.exe
- 一個 Scripts 目錄
- 一個 Lib 目錄
這里和普通環(huán)境有 2 點(diǎn)不一樣的地方:
- python.exe 也放在了 Scripts 目錄下面(原因下面會講)
- Lib 目錄下面只有 site-packages 目錄
讓我們來試一下。
venv 模塊
在 Python 2.x 的時候,創(chuàng)建虛擬環(huán)境還需要安裝第三方的 virtualenv,但是自從 Python 3.3 版本之后,標(biāo)準(zhǔn)庫里內(nèi)置了 venv 模塊,可以用來創(chuàng)建虛擬環(huán)境。
在命令行中使用下面的命令來快速創(chuàng)建一個虛擬環(huán)境:
C:UsersDavy>python -m venv venvdemo上面的命令會在當(dāng)前目錄下,新建一個名為 venvdemo 的虛擬環(huán)境。里面的文件夾:
其中 Include 基本不用管,Lib 目錄下也沒什么特別的,主要就是 Scripts 目錄:
其中多出了 activate 和 deactivate 用來 激活 和 去激活 虛擬環(huán)境。
“ activate 有多個后綴的文件,適配多個環(huán)境,敲命令的時候不需要帶后綴讓我們來激活試試:
C:UsersDavy>venvdemoScriptsactivate注意到一點(diǎn),激活的時候我們需要指定 activate 完整的路徑,因?yàn)樗诘哪夸洸⒉辉?PATH 環(huán)境變量之中。
激活之后,我們就進(jìn)入了虛擬環(huán)境,這時候不管是執(zhí)行 python 還是 pip 針對的都是虛擬環(huán)境里面的。
其實(shí)這也沒什么神奇的操作,激活只不過就是把虛擬環(huán)境的 Scripts 目錄臨時添加到了 PATH 環(huán)境變量的第一位。
這里也解釋了,為啥要把 python.exe 也放到了 Scripts 目錄下,因?yàn)檫@樣只需要加一個路徑到環(huán)境變量中即可。
同時這也提醒我們注意,不是只有激活才能進(jìn)入虛擬環(huán)境,我們?nèi)绻旬?dāng)前路徑切換到了虛擬環(huán)境的 Scripts 目錄下,啟動 python 也是在虛擬環(huán)境中了。
繼續(xù)打印一下 sys.path 看看:
(venvdemo) C:UsersDavy>python Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from pprint import pprint >>> import sys >>> pprint(sys.path) ['','C:UsersDavyAppDataLocalProgramsPythonPython38python38.zip','C:UsersDavyAppDataLocalProgramsPythonPython38DLLs','C:UsersDavyAppDataLocalProgramsPythonPython38lib','C:UsersDavyAppDataLocalProgramsPythonPython38','C:UsersDavyvenvdemo','C:UsersDavyvenvdemolibsite-packages']可以看到相對于上面普通的系統(tǒng)環(huán)境,最下面的兩條發(fā)生了變化,注意其中的第 4 條路徑 'C:UsersDavyAppDataLocalProgramsPythonPython38lib',它正是標(biāo)準(zhǔn)庫的路徑。
我們在執(zhí)行去激活的時候,就不用再指定完整的路徑了。
為什么要有虛擬環(huán)境
當(dāng)我們安裝一個 Python 程序或者庫的時候,一般情況下我們雖然是想要安裝 1 個包,比如說, pip install django。然而實(shí)際安裝的都是一堆包。這些包默認(rèn)都會安裝到 Python 環(huán)境的 site-packages 目錄下面。
下次再安裝其它包時,也是如此。因?yàn)橥粋€庫,只能在一個環(huán)境中存在一份,那么這其中如果發(fā)現(xiàn)了某個依賴包已經(jīng)存在,只能大家公用。
這樣下去,說不定哪一天這中間就出現(xiàn)了版本不兼容。
使用虛擬環(huán)境
因?yàn)樘摂M環(huán)境的必要性,現(xiàn)在大多數(shù)的 Python 開發(fā)工具都支持虛擬環(huán)境的相關(guān)操作。
具體每個工具有所不同,但是一般只需要注意一點(diǎn)即可:指定虛擬環(huán)境中 python.exe 的位置。一旦確定了它的位置,就確定了環(huán)境的位置。也就不用每次都去激活。
“ 仔細(xì)觀察,虛擬環(huán)境中的 python.exe 和系統(tǒng)中的 python.exe 并不完全一樣。保存虛擬環(huán)境
我們知道在使用 pip install 的時候可以通過 -r 選項(xiàng)指定一個 requirements 文件,這樣就能批量安裝所有依賴。
在 requirements 里面可以精確的指定安裝包版本,有效地避免不兼容問題。
執(zhí)行 pip freeze 可以把當(dāng)前環(huán)境安裝的包以 requirements 的格式輸出。
(venvdemo) C:UsersDavy>pip freeze asgiref==3.2.3 Django==3.0.3 pytz==2019.3 sqlparse==0.3.0把輸出結(jié)果保存到文件中就可以了,這樣我們就精確的得到當(dāng)前環(huán)境的版本信息,可以再其它地方重建這個環(huán)境。
“ 文章內(nèi)容雖基礎(chǔ),整理發(fā)布不輕松
如果看過有幫助,不妨 點(diǎn)贊 + 關(guān)注,謝謝!
總結(jié)
以上是生活随笔為你收集整理的python 虚拟环境_理解Python虚拟环境的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教你轻松几步升级电脑内存如何给电脑升级内
- 下一篇: 我的老古董电脑古董电脑吧