虛擬開發環境搭建
上節課我們認識了什么是 Web 框架,知道 Web 框架可以給我們的網站開發帶來很多便利,節省很多時間。那么這節課我們繼續來介紹一個在實際開發中非常實用的工具–虛擬開發環境。
虛擬環境是近年來開發 Python Web 項目的必備前提,它就很好地解決了多個 Python 項目之間第三方模塊版本沖突的問題,我們也會將其作為學習 Django 開發的一個基礎,后續的所有 Django 示例代碼都會在虛擬環境中實驗。接下來我們會介紹什么是虛擬環境以及如何使用虛擬環境。
1. 虛擬環境介紹
1.1 什么是虛擬環境?
在我們第一次安裝好 Python 后,我們就有了一個全局的 Python 環境, 也稱為系統環境。使用虛擬環境工具在全局環境的基礎上可以創建多個相互獨立、互不影響的虛擬環境。這些虛擬環境本質上來說就是相互獨立的文件夾,里面包含了 Python 解釋器和相關依賴的模塊。
1.2 為什么要使用虛擬環境?
在 Python 開發,特別是 Python Web 項目開發中,我們會使用大量的第三方模塊。有時候開發中需要特定版本的模塊。如果本地只有一個項目,我們直接用 pip install
安裝對應版本的模塊即可,但是如果本地有多個項目,每個項目中可能會有模塊沖突,或者 Python 版本的沖突,該如何解決這些問題呢?這個時候虛擬環境就可以派上用場了。
針對每個 Python 項目,我們可以指定一個虛擬環境,在這個虛擬環境中,我們準備好相應版本的 Python 解釋器,使用 pip
安裝項目依賴的第三方模塊。這樣每個項目都有自己的環境和對應安裝好的第三方模塊。每個項目的環境都互不干擾。當我們需要開發或者啟動某個項目時,使用命令進入對應的虛擬環境即可。這樣可以非常有效的解決上述多個項目之間包沖突的問題。
使用 Pycharm 進行 Python 項目開發時,虛擬環境已經成了標配。Pycharm 在創建 Python 項目時,會自動創建好相應的虛擬環境,并默認使用虛擬環境的 Python 解釋器。當然我們也可以自行選擇,但這說明了虛擬環境在 Python 開發中越來越重要。
2. Python 虛擬環境管理工具
2.1 virtualenv
從 Python 3.3 開始 virtualenv 的子集作為 venv 標準庫被集成到了 Python 中。它可以用來創建 Python 的虛擬環境,它的安裝和使用也非常簡單:
$ pip install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple
$ pip3 install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple
該工具的使用命令如下:
-
virtualenv [虛擬環境的名稱]
:在當前目錄下創建虛擬環境,加上-p
選項可以指定 python 解釋器路徑,不然會默認使用全局環境的 python 解釋器; -
激活和退出虛擬環境:
-
cd [虛擬環境名稱]
: 進入虛擬環境目錄; -
source bin/activate
:激活虛擬環境; -
deactivate
: 退出虛擬環境。
-
在真正項目部署上線的時候,我們使用 pip freeze > requirements.txt
命令將項目所依賴的 python 模塊保存到 requirements.txt 文件中,然后在線上環境重新安裝并激活新的虛擬環境,最后使用 pip install -r requirements.txt
即可完成虛擬環境的遷移。
2.2 pyenv
純 pyenv 是可以看做一個 Python 版本管理器,可以同時管理多個 Python 版本共存。 簡單地說,pyenv 可以根據需求使用戶在系統里安裝和管理多個 Python 版本。它的基本功能如下:
-
配置當前用戶的 Python 的版本;
-
配置當前 shell 的 python 版本;
-
配置某個項目(目錄及子目錄)的 Python 版本;
-
配置多個虛擬環境。
注意:pyenv 的工作原理就是利用系統環境變量 PATH 的優先級,劫持 Python 的命令到 pyenv 上,根據用戶所在的環境或目錄,使用不同版本的 Python 。
2.2.1 pyenv 的安裝、更新和卸載
安裝: 在 Linux 系統上安裝 pyenv 的方式非常簡單,由官方提供的安裝 bash 腳本,也可以直接下載源碼即可。具體操作如下:
# 安裝git
$ yum install git -y
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# 安裝 pyenv-virtualenv
$ git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
$ cat ~/.bashrc
...
# 在~/.bashrc最后加上如下3行
export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
# 使配置生效
$ source ~/.bashrc
# 查看pyenv的版本
$ pyenv version
更新: 因為是使用 git 安裝的 pyenv,所以更新只需要繼續用 git 拉最新的代碼即可。更新 pyenv 步驟如下:
cd ~/.pyenv 或者 cd $(pyenv root)
git pull
卸載: 由于 pyenv 把一切都放在~/.pyenv 下了,所以卸載很方便,兩個步驟就行了:
-
刪除
~/.bashrc
中添加的環境變量; -
刪除
~/.pyenv
目錄及其下面所有文件。rm -rf ~/.pyenv` 或者 `rm -rf $(pyenv root)
Tips:pyenv 并不支持 Windows,因為作者大大不想浪費時間去兼容 Windows 平臺。
2.2.2 pyenv 的命令
pyenv 的常用命令如下:
-
pyenv commands
: 查看 pyenv 工具支持的命令; -
pyenv local
:python 的局部設置,當前目錄生效,加上--unset
選項表示取消; -
pyenv global
:python 的全局設置,整個系統生效; -
pyenv shell
:指定當前 shell 使用的 Python , 可以使用--unset
取消指定 ; -
pyenv --version
: 查看 pyenv 的版本; -
pyenv version
:顯示當前活動的 Python 版本。# 系統環境 [root@server ~]# pyenv version system (set by /root/.pyenv/version) # 激活創建的虛擬環境 [root@server ~]# pyenv activate env-3.8.1 pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior. # 再次查看 (env-3.8.1) [root@server ~]# pyenv version env-3.8.1 (set by PYENV_VERSION environment variable)
-
pyenv versions
:查看所有的虛擬環境; -
pyenv install --list
: 查看所有可以安裝的 Python 版本; -
pyenv install
:安裝對應版本的 Python 作為虛擬環境的解釋器。這一步通常第一次需要聯網下載對應的 Python 包,會比較慢; -
pyenv uninstall
:卸載某個 Python 版本。
pyenv-virtualenv 工具的常用命令:
-
pyenv virtualenv python版本號 name
:創建一個虛擬環境,,命名為 name, 創建好后可通過pyenv versions
來查看; -
pyenv activate name
:切換到 name 虛擬環境中 ; -
pyenv deactivate
:退出虛擬環境 ; -
pyenv virtualenv-delete name
:刪除名為 name 的虛擬環境;
2.3 pyenv 實戰
接下來我們使用 pyenv 工具在 CentOS 系統上實戰下虛擬環境的操作,這里安裝 pyenv 的步驟略掉。
檢查 pyenv 的版本,以及可以安裝的 Python 版本。可以看到目前 Python 的最新版本已經到 3.9 了
[root@server ~]# pyenv --version
pyenv 1.2.15-9-gac246e1
[root@server ~]# pyenv install --list
Available versions:
2.1.3
...
2.7.17
...
3.7.6
3.8.0
3.8-dev
3.8.1
3.9-dev
...
安裝 Python 3.8.1 版本解釋器,這樣后續可以基于 3.8.1 版本的 Python 創建虛擬環境:
[root@server ~]# pyenv install 3.8.1
Downloading Python-3.8.1.tar.xz...
-> https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tar.xz
...
使用 3.8.1 版本的 python 解釋器創建虛擬環境 env-3.8.1
[root@server ~]# pyenv virtualenv 3.8.1 env-3.8.1
Looking in links: /tmp/tmp7m4c6giw
Requirement already satisfied: setuptools in /root/.pyenv/versions/3.8.1/envs/env-3.8.1/lib/python3.8/site-packages (41.2.0)
Requirement already satisfied: pip in /root/.pyenv/versions/3.8.1/envs/env-3.8.1/lib/python3.8/site-packages (19.2.3)
[root@server ~]# pyenv versions
system
* 3.8.1 (set by /root/.pyenv/version)
3.8.1/envs/env-3.8.1
env-3.8.1
進入 env-3.8.1 的虛擬環境,在輸入 python
命令后可以看到 版本是 3.8.1。另外通過 pip
命令可以查看已經安裝的模塊。
[root@server ~]# pyenv activate env-3.8.1
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(env-3.8.1) [root@server ~]# python
Python 3.8.1 (default, Dec 24 2019, 17:04:00)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
(env-3.8.1) [root@server ~]# pip list
Package Version
---------- -------
pip 19.2.3
setuptools 41.2.0
在虛擬環境中安裝第三方模塊,比如操作 MySQL 數據的 pymysql:
(env-3.8.1) [root@server ~]# pip install pymsql
(env-3.8.1) [root@server ~]# ls ~/.pyenv/versions/env-3.8.1/lib64/python3.8/site-packages/pymysql
_auth.py connections.py cursors.py optionfile.py _socketio.py
charset.py constants err.py protocol.py times.py
_compat.py converters.py __init__.py __pycache__ util.py
最后退出該虛擬環境,并且由于項目不再繼續,將刪除該虛擬環境??梢钥吹皆趧h除該虛擬環境后,對應的目錄也被刪除了
(env-3.8.1) [root@server ~]# pyenv deactivate
[root@server ~]# pyenv virtualenv-delete env-3.8.1
pyenv-virtualenv: remove /root/.pyenv/versions/3.8.1/envs/env-3.8.1? y
[root@server ~]# ls ~/.pyenv/versions/3.8.1/envs
我們實戰操作了 pyenv 工具管理虛擬環境,主要是加深了對虛擬環境的理解。其實一個虛擬環境對應的就是一個目錄,在虛擬環境中安裝的所有模塊都會放到這個目錄下。這樣每個環境之間下載的模塊不會產生沖突,這樣能很好解決不同項目依賴包沖突的問題。
3. 小結
本小節我們介紹了 Python 開發中常用的虛擬環境相關知識,同時介紹了 2 種用于創建和管理虛擬環境的工具 virtualenv 和 pyenv。其中 pyenv 工具可以集合 pip 和 virtualenv 相關功能,更為有用。后續我們選擇使用 pyenv 來創建虛擬環境并進行 Django 的開發實戰。
下節預告:
在食用指南中我們說到了學習本課程需要具備一些 HTML/CSS/JS 基礎,那么下節課《Web 相關知識 - HTML/CSS/JS》中我們就來介紹一下本課程中需要用到的 HTML/CSS/JS 知識。