虛擬開發(fā)環(huán)境搭建
本節(jié)講解了什么是虛擬開發(fā)環(huán)境以及虛擬開發(fā)環(huán)境的功能,它用于解決版本依賴的問題,講解了如何使用 virtualenv 命令創(chuàng)建、激活一個虛擬開發(fā)環(huán)境。
1. 什么是虛擬開發(fā)環(huán)境
虛擬開發(fā)環(huán)境是一個隔離的運行環(huán)境,每個運行環(huán)境中包含有一套獨立的組件:Python 解釋器、各種第三方包。每個運行環(huán)境中包含的組件是私有的、不共享的,因此運行環(huán)境之間是隔離的。
使用 Python 開發(fā)一個項目,需要安裝各種第三方包,項目有可能依賴特定版本的第三方包。例如,項目 A 依賴 3.5.3 版本的 redis 包,而項目 B 依賴 3.0.0 版本的 redis 包。通過為項目 A 和項目 B 分別設置一個虛擬開發(fā)環(huán)境,項目 A 的虛擬開發(fā)環(huán)境中包含 3.5.3 版本的 redis 包,項目 B 的虛擬開發(fā)環(huán)境中包含 3.0.0 版本的 redis 包,從而解決了第三方包的版本依賴問題。
2. 不同版本的包帶來的問題
2.1 不同版本的包
默認情況下,使用 pip3 安裝包時,會安裝包的最新版本,例如:
$ sudo pip3 install redis
Collecting redis
Downloading redis-3.5.3-py2.py3-none-any.whl (61 kB)
|████████████████████████████████| 72 kB 126 kB/s
Installing collected packages: redis
Successfully installed redis-3.5.3
可以看到使用 pip 安裝 redis 包會默認安裝最新的 3.5.3 版本。
但某些情況下,出于兼容性的考慮,程序只能使用特定版本的 redis 包,需要使用 pip3 安裝包的特定版本,例如:
$ sudo pip3 install redis==3.0.0
Collecting redis==3.0.0
Downloading redis-3.0.0-py2.py3-none-any.whl (61 kB)
|████████████████████████████████| 61 kB 137 kB/s
Installing collected packages: redis
Successfully installed redis-3.0.0
指定選項 redis==3.0.0,會安裝 redis 3.0.0 版本。
2.2 帶來的問題
因為應用程序可能依賴特定版本的包,當系統(tǒng)中存在多個項目時,可能會出現(xiàn)沖突。例如:
- 有兩個項目:項目 A 和 項目 B;
- 項目 A 依賴于 redis-3.5.3;
- 項目 B 依賴于 redis-3.0.0。
如果,需要同時進行兩個項目的開發(fā),則必須:
- 開發(fā)項目 A 時,卸載系統(tǒng)中現(xiàn)有的 redis 包,安裝 redis-3.5.3;
- 開發(fā)項目 B 時,卸載系統(tǒng)中現(xiàn)有的 redis 包,安裝 redis-3.0.0。
在兩個項目之間切換時,用戶需要頻繁的安裝和卸載 redis 包,顯然是很不合理的。
那么,這種不合理應該如何解決呢?
在 Python 開發(fā)中有個神器叫做 virtual 就是專門用來解決問題的,下面我們就來看下 virtual 這個神器到底神在哪里?
3. 使用 virtual 解決沖突
上面我們說到,不同的項目依賴不同的包很有可能造成項目沖突問題,而 virtual 則正是為了解決這個問題而誕生的:
virtualenv 命令可以創(chuàng)建一個隔離的運行環(huán)境:
- 每個運行環(huán)境中包含有一套組件:Python 解釋器、各種第三方包;
- 每個運行環(huán)境中包含的組件是私有的、不共享的;
- 因此運行環(huán)境之間是隔離的。
針對 2.2 小節(jié)中項目依賴的問題,使用 virtualenv 的解決方法如下圖所示:
使用 virtualenv 為項目 A 創(chuàng)建一個隔離環(huán)境,隔離環(huán)境中包括 python 解釋器和 redis-3.5.3。使用 virtualenv 為項目 B 創(chuàng)建一個隔離環(huán)境,隔離環(huán)境中包括 python 解釋器和 redis-3.0.0。
如果,需要同時進行兩個項目的開發(fā),則開發(fā)項目 A 時,進入項目 A 的虛擬環(huán)境,開發(fā)項目 B 時,進入項目 B 的虛擬環(huán)境,也可以同時打開兩個終端,分別進行項目 A 和項目 B 的虛擬環(huán)境,同時進行兩者的項目開發(fā)。每一個虛擬環(huán)境中的 Python 版本,包版本互不影響,自然完美解決了沖突問題。
4. virtualenv 的使用
既然知道了有 virtualenv 這個神器,那么我們就要把它用在我們的實際開發(fā)中去,下面我們就演示一下 virtualenv 如何使用:
4.1 安裝 virtualenv
在 linux 下,使用 apt 命令安裝 virtualenv:
$ sudo apt install virtualenv
或者,使用 pip3 命令安裝 virtualenv:
$ sudo pip3 install virtualenv
4.2 安裝一個純凈的虛擬環(huán)境
假設用戶是 guest,當前目錄是 /home/guest:
$ pwd
/home/guest
現(xiàn)在希望創(chuàng)建一個虛擬環(huán)境 pure,將虛擬環(huán)境的 python 和第三方包存放在 /home/guest/pure 目錄下:
$ virtualenv -p python3 --no-site-packages pure
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/guest/pure/bin/python3
Also creating executable in /home/guest/pure/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.
選項 -p python3,表示 Python 有兩個版本 python2 和 python3,指定虛擬環(huán)境中的 python 版本為 python3;選項 --no-site-packages,表示不安裝任何所第三方包,得到了一個不帶任何第三方包的 “純凈” 的 Python 運行環(huán)境。選項 pure,表示將虛擬環(huán)境的 python 和第三方包存放在 pure 目錄下,注意,創(chuàng)建虛擬環(huán)境后,不可以再移動虛擬環(huán)境目錄 pure 的位置。
4.3 虛擬環(huán)境 pure 的內(nèi)容
使用 virtualenv 命令創(chuàng)建虛擬環(huán)境,創(chuàng)建的目錄 pure 中的內(nèi)容如下:
目錄 pure 中包含的文件功能如下表所示:
文件名 | 功能 |
---|---|
bin | 存放 python3、pip3 等程序 |
lib | 存放第三方庫 |
bin/activate | 進入虛擬環(huán)境的腳本 |
4.4 進入虛擬環(huán)境
$ source pure/bin/activate
- bin/activate 是進行虛擬化環(huán)境的腳本;
- 使用 source 命令執(zhí)行 bin/activate 腳本。
bin/activate 執(zhí)行成功后,shell 的命令提示符變?yōu)椋?/p>
(pure) $
- 原先的提示符是 $,現(xiàn)在是(pure) $;
- 提示用戶現(xiàn)在處于 pure 環(huán)境中,此時輸入 python3;
- 執(zhí)行的 python3 命令是 pure/bin/python3;
- 而不是系統(tǒng)的 /usr/bin/python3 。
4.5 在虛擬環(huán)境中安裝指定版本的包
在 pure 環(huán)境中,安裝指定版本的 redis:
(pure) $ pip3 install redis==3.0.0
Collecting redis==3.0.0
Downloading redis-3.0.0-py2.py3-none-any.whl (61 kB)
|████████████████████████████████| 61 kB 137 kB/s
Installing collected packages: redis
Successfully installed redis-3.0.0
版本為 3.0.0 的 redis 會被安裝到 pure 目錄下:
(pure) $ ls pure/lib/python3.6/site-packages
easy_install.py pkg_resources-0.0.0.dist-info setuptools
pip __pycache__ setuptools-49.2.0.dist-info
pip-20.1.1.dist-info redis wheel
pkg_resources redis-3.0.0.dist-info wheel-0.34.2.dist-info
在 pure 環(huán)境下所有的第三方包被安裝到 pure/lib/python3.6/site-packages 目錄中去,目錄 redis-3.0.0.dist-info 表示當前安裝在 pure 環(huán)境中的 redis 的版本是 3.0.0。
4.6 退出虛擬環(huán)境
在虛擬環(huán)境中,執(zhí)行 deactivate,會退出虛擬環(huán)境:
(pure) $ deactivate
bin/deactivate 執(zhí)行成功后,shell 的命令提示符變?yōu)椋?/p>
$
- 原先的提示符是 (pure) $,現(xiàn)在是 $;
- 提示用戶現(xiàn)在處于系統(tǒng)環(huán)境中,此時輸入 python3;
- 執(zhí)行的 python3 命令是系統(tǒng)的 /usr/bin/python3;
- 而不是 pure/bin/python3。
5. 小結(jié)
本節(jié)講解了什么是虛擬開發(fā)環(huán)境以及虛擬開發(fā)環(huán)境的功能,使用思維導圖總結(jié)如下: