虚拟开发环境搭建

上节课我们认识了什么是 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

最后退出该虚拟环境,并且由于项目不再继续,将删除该虚拟环境。可以看到在删除该虚拟环境后,对应的目录也被删除了

(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 种用于创建和管理虚拟环境的工具 virtualenvpyenv。其中 pyenv 工具可以集合 pip 和 virtualenv 相关功能,更为有用。后续我们选择使用 pyenv 来创建虚拟环境并进行 Django 的开发实战。

下节预告:

食用指南中我们说到了学习本课程需要具备一些 HTML/CSS/JS 基础,那么下节课《Web 相关知识 - HTML/CSS/JS》中我们就来介绍一下本课程中需要用到的 HTML/CSS/JS 知识。