Python 虛擬環(huán)境工作原理解析
Python 的虛擬環(huán)境用來創(chuàng)建一個(gè)相對(duì)獨(dú)立的執(zhí)行環(huán)境,尤其是一些依賴的三方包,最常見的如不同項(xiàng)目依賴同一個(gè)但是不同版本的三方包,而且,在虛擬環(huán)境中的安裝包不會(huì)影響到系統(tǒng)的安裝包。
不過,其具體的工作原理是怎樣的,這里詳細(xì)介紹。
簡介幾乎每個(gè)語言都包含自己的包管理工具,這是一個(gè)非常復(fù)雜的話題,而不同語言選擇的實(shí)現(xiàn)又略有區(qū)別,都會(huì)做一些選擇和取舍。而 Python 的包管理解決方案很多,例如 pip、virtualenv、pyenv 等等。
不過 Python 語言本身的機(jī)制決定了其原理一樣。
使用比較常用的是 virtualenv 工具,可以參考 Guide to Python 中的詳細(xì)介紹,另外,Python3 也提供了自己的虛擬環(huán)境創(chuàng)建模塊,在創(chuàng)建完成后基本都是通過一個(gè)腳本啟用獨(dú)立環(huán)境。
例如,如下是使用 virtualenv 以及 venv 的虛擬環(huán)境創(chuàng)建過程。
$ mkdir /tmp/project && cd /tmp/project$ virtualenv --no-site-packages foobar$ python3 -m venv foobar
然后,就可以通過 source foobar/bin/activate 命令激活新環(huán)境。
激活腳本所謂的獨(dú)立環(huán)境,無非就是解決兩個(gè)問題:A) 執(zhí)行 Python 解析器所使用的版本;B) 使用獨(dú)立的包。其中前者,在 Linux 主要是通過 PATH 環(huán)境變量設(shè)置,在 activate 腳本中有如下的內(nèi)容。
VIRTUAL_ENV='/tmp/project/foobar'export VIRTUAL_ENV_OLD_VIRTUAL_PATH='$PATH'PATH='$VIRTUAL_ENV/bin:$PATH'export PATH
也就是將創(chuàng)建的目錄添加到 PATH 環(huán)境變量最開始,那么就會(huì)優(yōu)先查找該路徑,這樣就解決了 python 解析器獨(dú)立的問題。
工作原理如果要使用獨(dú)立的包,那么關(guān)鍵就是如何在通過 import 導(dǎo)入時(shí)查找到所需的包。
包的查找順序可以查看Python 模塊簡介 中的介紹,簡單來說,就是先查看是否是內(nèi)置模塊,然后再從 sys.path 列表指定的地址中搜索。所以,這里的關(guān)鍵就是 sys.path 列表的生成。
關(guān)于 sys.prefix在 Python 啟動(dòng)的時(shí)候,會(huì)先加載一個(gè)強(qiáng)依賴的 os.py 包,而查找這個(gè)包是根據(jù)解析器的當(dāng)前路徑,以及固定的查找規(guī)則來實(shí)現(xiàn)的。
簡單來說,就是在當(dāng)前路徑加上 lib/python${VERSION}/os.py 逐層向上查找,注意,如果是 64 位的操作系統(tǒng),那么會(huì)使用 lib64 替換掉之前的 lib 路徑。
例如,默認(rèn)的 Python3 的解析器路徑為 /usr/bin/python3.6 ,那么基礎(chǔ)路徑是 /usr/bin/ ,所以,其查找順序?yàn)椤?/p>
/usr/bin/lib64/python3.6/os.py/usr/lib64/python3.6/os.py/lib64/python3.6/os.py
只要在任意路徑上找到 os.py 包,那么就會(huì)退出查找,并設(shè)置好 sys.prefix 變量,詳細(xì)可以通過 strace python 查看,會(huì)有如下的搜索路徑。
stat('/usr/bin/Modules/Setup', 0x7fffb7146300) = -1 ENOENT (No such file or directory)stat('/usr/bin/lib64/python2.7/os.py', 0x7fffb71462f0) = -1 ENOENT (No such file or directory)stat('/usr/bin/lib64/python2.7/os.pyc', 0x7fffb71462f0) = -1 ENOENT (No such file or directory)stat('/usr/lib64/python2.7/os.py', {st_mode=S_IFREG|0644, st_size=25910, ...}) = 0
在查找到 os.py 之后,會(huì)將該路徑設(shè)置為 sys.prefix 變量,然后解析器就會(huì)到 ${sys.prefix}/lib/python${VERSION} 目錄下查找包。
總結(jié)那么其工作原理就是,將 python 解析器保存在 ${VENV_PATH}/bin/python ,然后創(chuàng)建 ${VENV_PATH}/lib/python${VERSION} 目錄,并將相關(guān)的文件復(fù)制到該目錄下,可以復(fù)制文件,也可以使用軟連接。
其它如上,如果是 Python3 就可以直接使用內(nèi)置的 venv 模塊,其原理與上述的相同,同時(shí)通過 pyvenv.cfg 配置文件來標(biāo)識(shí)原始的 home 位置,該文件的內(nèi)容如下。
home = /usr/bininclude-system-site-packages = falseversion = 3.6.8
如果 include-system-site-packages 為 true ,解釋器啟動(dòng)時(shí)就會(huì)將系統(tǒng)的庫添加到 sys.path 里面,這樣在虛擬環(huán)境就可以 import 系統(tǒng)中安裝的包了。
注意,Python3 提供的 venv 模塊只能根據(jù)當(dāng)前版本創(chuàng)建,不能支持 Python2 。
參考 Virtualenv 官方文檔,細(xì)節(jié)可以參考該文檔。
Creation of virtual environments Python3 提供的 venv 介紹,包括常見參數(shù)以及配置文件。
← Older
到此這篇關(guān)于Python 虛擬環(huán)境工作原理解析的文章就介紹到這了,更多相關(guān)Python 虛擬環(huán)境原理內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. 編程語言PHP在Web開發(fā)領(lǐng)域的優(yōu)勢(shì)在哪?2. 詳解Android studio 動(dòng)態(tài)fragment的用法3. Spring Boot和Thymeleaf整合結(jié)合JPA實(shí)現(xiàn)分頁效果(實(shí)例代碼)4. 基于android studio的layout的xml文件的創(chuàng)建方式5. Android如何加載Base64編碼格式圖片6. 什么是python的自省7. 圖文詳解vue中proto文件的函數(shù)調(diào)用8. .Net Core使用Coravel實(shí)現(xiàn)任務(wù)調(diào)度的完整步驟9. 在IDEA中實(shí)現(xiàn)同時(shí)運(yùn)行2個(gè)相同的java程序10. 解決Android studio xml界面無法預(yù)覽問題

網(wǎng)公網(wǎng)安備