Python 虛擬環境工作原理解析

2022-09-27 05:06:07 字數 2503 閱讀 9359

python 的虛擬環境用來建立乙個相對獨立的執行環境,尤其是一些依賴的三方包,最常見的如不同專案依賴同乙個但是不同版本的三方包,而且,在虛擬環境中的安裝包不會影響到系統的安裝包。

不過,其具體的工作原理是怎樣的,這裡詳細介紹。

幾乎每個語言都包含自己的包管理工具,這是乙個非常複雜的話題,而不同語言選擇的實現又略有區別,都會做一些選擇和取捨。而 python 的包管理解決方案很多,例如 pip、virtualenv、pyenv 等等。

不過 python 語言本身的機制決定了其原理一樣。

比較常用的是 virtualenv 工具,可以參考 guide to python 中的詳細介紹,另外,python3 也提供了自程式設計客棧己的虛擬環境建立模組,在建立完成後基本都是通過乙個指令碼啟用獨立環境。

例如,如下是使用 virtualenv 以及 venv 的虛擬環境建立過程。

$ mkdir /tmp/project && cd /tmp/project

$ virtualenv --no-site-packages foobar

$ python3 -m venv foobar

然後,就可以通過source foobar/bin/activate命令啟用新環境。

所謂的獨立環境,無非就是解決兩個問題:a) 執行 python 解析器所使用的版本;b) 使用獨立的包。其中前者,在 linux 主要是通過path環境變數設定,在activate指令碼中有如下的內容。

virtual_ecbabfunyoynv=程式設計客棧"/tmp/project/foobar"

export virtual_env

_old_virtual_path="$path"

path="$virtual_env/bin:$path"

export path

也就是將建立的目錄新增到path環境變數最開始,那麼就會優先查詢該路徑,這樣就解決了 python 解析器獨立的問題。

如果要使用獨立的包,那麼關鍵就是如何在通過import匯入時查詢到所需的包。

包的查詢順序可以檢視python 模組簡介 中的介紹,簡單來說,就是先檢視是否是內建模組,然後再從sys.path列表指定的位址中搜尋。所以,這裡的關鍵就是sys.path列表的生成。

在 python 啟動的時候,會先載入乙個強依賴的os.py包,而查詢這個包是根據解析器的當前路徑,以及固定的查詢規則來實現的。

簡單來說,就是在當前路徑加上lib/python$/os.py逐層向上查詢,注意,如果是 64 位的操作系www.cppcns.com統,那麼會使用lib64替換掉之前的lib路徑。

例如,預設的 python3 的解析器路徑為/usr/bin/python3.6,那麼基礎路徑是/usr/bin/,所以,其查詢順序為。

/usr/bin/lib64/python3.6/os.py

/usr/lib64/python3.6/os.py

/lib64/python3.6/os.py

只要在任意路徑上找到os.py包,那麼就會退出查詢,並設定好sys.prefix變數,詳細可以通過strace python檢視,會有如下的搜尋路徑。

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", ) = 0

在查詢到os.py之後,會將該路徑設定為sys.prefix變數,然後解析器就會到$/lib/python$目錄下查詢包。

那麼其工作原理就是,將 python 解析器儲存在$/bin/python,然後建立$/lib/python$目錄,並將相關的檔案複製到該目錄下,可以複製檔案,也可以使用軟連線。

如上,如果是 python3 就可以直接使用內建的venv模組,其原理與上述的相同,同時通過pyvenv.cfg配置檔案來標識原始的 home 位置,該檔案的內容如下。

home = /usr/bin

include-system-site-packages = false

version = 3.6.8

如果include-system-site-packages為true,直譯器啟動時就會將系統的庫新增到sys.path裡面,這樣在虛擬環境就可以import系統中安裝的包了。

注意,python3 提供的venv模組只能根據當前版本建立,不能支援 python2 。

參考 virtualenv 官方文件,細節可以參考該文件。程式設計客棧

creation of virtual environments python3 提供的 venv 介紹,包括常見引數以及配置檔案。

← older

python 虛擬環境

sudo apt get install pip pip install upgrade pip sudo apt get install python virtualenv mkdir home virtualenvs export workon home home virtualenvs sou...

python 虛擬環境

由於在 mac 上同時安裝 anaconda2 和 anaconda3 的時候崩潰了多次,現在需要在 python2的環境下進行一些操作,所以需要產生乙個虛擬環境。pip install virtualenv virtualenv path venv name cd path source venv...

python虛擬環境

1.在電腦上將python安裝完成,並記住安裝的路徑 2.配置系統環境變數 控制面板 系統 高階 環境變數 系統變數 的path路徑,編輯新增路徑的版本即為預設使用版本 5.使用 virtualenv 虛擬環境名稱 命令建立虛擬環境,會在當前所在目錄進行建立 6.進入虛擬環境 開啟命令列 進入虛擬環...