1. 程式人生 > Django入門教學 >03 虛擬開發環境搭建

03 虛擬開發環境搭建

虛擬開發環境搭建

虛擬環境是近年來開發 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

最後退出該虛擬環境,並且由於專案不再繼續,將刪除該虛擬環境。可以看到在刪除該虛擬環境後,對應的目錄也被刪除了

(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 的開發實戰。