概念
虛擬環境是一個包含了特定 Python 解析器以及一些軟件包的自包含目錄,不同的應用程序可以使用不同的虛擬環境,從而解決了依賴沖突問題,而且虛擬環境中只需要安裝應用相關的包或者模塊,可以給部署提供便利。
構建虛擬環境
原理
主要是利用了操作系統中環境變量以及進程間環境隔離的特性。例如,操作系統中的環境變量可以為程序提供信息交換介質,進程可以共享操作系統中的環境變量,亦可以為進程指定環境變量。其中PATH為一個很重要的環境變量,用於為操作系統提供可執行文件的訪問路徑等等。
python虛擬環境就是利用這個特性構建的,在虛擬環境激活之前,激活的腳本會將當前命令行程序的PATH修改為虛擬環境的,這樣執行的命令就會在被修改的PATH中查找,從而避免了從原本PATH中找到命令,從而實現了python環境的隔離。
為了讓開發容易區分當前環境是否虛擬環境以及是那個虛擬環境,命令提示符前會加上特殊標記,例如:
Python 虛擬環境
創建
virtualenv 工具
已淘汰,所以不考慮使用。
venv 模塊
Python3.3 之后,可以用模塊 venv 代替 virtualenv 工具,好處是不用單獨安裝,3.3 及之后的版本,都可以通過安裝好的 Python 來創建虛擬環境:
python -m venv myvenv
可以在當前目錄創建一個名為 myvenv 的虛擬環境
venv 常用參數
--without-pip: 不需要安裝 pip,默認為安裝
--clear:如果創建虛擬環境的目錄已經有了其他虛擬環境,清楚重建
因為 venv 是依附於一個 Python 解析器創建的,所以不需要指定 Python 解釋器版本。
激活
可以理解成將當前命令行環境中 PATH 變量的值替換掉。
- Windows 系統中,激活腳本路徑是
\Scripts\activate.bat ,如果是 powershell 命令行,腳本換成 Activate.ps1 , 注意將 換成你自己的虛擬環境目錄。 - Linux 系統中,激活腳本路徑是
/bin/activate ,默認腳本沒有執行權限,要么設置腳本為可執行,要么用 source 命令執行,例如$ source myvenv/bin/activate
激活后,可以在命令行中看到虛擬環境標記,如上圖
打印 PATH,命令如下:
Linux 下:
echo $PATH
Windows 下
echo %PATH%
可以看到創建的虛擬環境腳本目錄被加載了最前面。
退出
退出虛擬環境很簡單,只需要執行 deactivate 命令就行,這個命令也在虛擬環境的腳本目錄下,因為激活時,將腳本目錄設置到 PATH 中了,所以可以直接使用。
退出虛擬環境相當於將 PATH 恢復成原來的
設置設置虛擬環境
在虛擬環境的根目錄下,我們可以看到一個叫 pyvenv.cfg 的文件。用文本編輯器打開后可以看到這幾行內容:
home = /Library/Frameworks/Python.framework/Versions/3.7/bin
include-system-site-packages = false
version = 3.7.0`
其中, home 指的是系統中 python 模塊的安裝位置。除非你自定義過了,不然這個默認值就是對的。
include-system-site-packages 這個參數可以設置是否開啟“引用系統中的模塊”的功能。如果開啟了,那么當你就可以直接使用系統中已經裝過的第三方模塊。(但是你在虛擬環境下裝的模塊就不能被其他地方的程序使用)
Version 可以指定 Python 的版本,前提是你必須要安裝這個版本。(比如你只裝了 python3.6 ,那么你設置成 2.7 就會出錯)
與vscode配合
同時按下 Ctrl+Shift+P, 在彈出的命令窗口中輸入 "解析器",然后在下拉列表中選擇 "Python:選擇解析器",這里會緩存一些已經創建好的解析器,如果沒有想要的,可以選擇 "Enter interpreter path" 來選擇解析器路徑,即已經創建好的虛擬環境腳本文件夾中的 Python 程序,就可以創建一個新的解析器。
如果編輯的是 Python 代碼文件,在狀態欄中也可以選擇和切換解釋器,更為方便
部署虛擬環境
流程:
1.開發完成后,使用 pip freeze > requirements.txt 命令將項目的庫依賴導出,作為代碼的一部分
2.將代碼上傳到服務器
3.在服務器上創建一個虛擬環境
4.激活虛擬環境,執行 pip install -r requirements.txt ,安裝項目依賴
怎么運行項目,需要看項目的具體情況:
Web 項目 Web 項目一般使用 Django、Flask 的 Web 開發的提供 Web 服務的項目,部署時需要一個 Web 容器,作為程序的運行環境,容器的配置中都有一個虛擬環境的設置,其實是指定 Python 解析器的路徑,將其設置為虛擬環境的目錄或者 Python 解析器就可以了,啟動時就用使用虛擬環境,並與其他環境隔離。例如 uWSGI 配置文件中 home 參數是用來指定解析器的。
服務類項目 服務類項目就是需要以服務的形式長時間運行的,例如之前介紹的 公交鬧鍾,或者一些定時爬蟲之類的,對於 Linux 而言,當前主流的服務方式是 Systemd,是一種比 init 更先進的服務管理工具,在服務腳本中, 設置 ExecStart 執行命令為全路徑的虛擬環境的 Python 解析器,服務啟動時,使用獨立的虛擬環境了。Windows 服務,對於達成 EXE 包的,不需要配置虛擬環境,因為打包時已經考慮了環境問題了,如果是腳本運行的話,需要指定全路徑的 Python 解析器
單次運行項目 對於一些測試或者實驗性質的項目,大多數情況下手動執行,只要在激活的虛擬環境下,或者用特定的 Python 解析器運行就好了,和在開發過程中運行區別不大。