5.2 虚拟环境搭建
在介绍 Python 虚拟环境搭建之前先介绍什么是 PEP,PEP 是 Python 增强提案 (Python Enhancement Proposal) 的缩写。Python 社区通过 PEP 来给 Python 语言建言献策,主要是通过邮件列表讨论问题、提议、计划等,经过了部分核心开发者审阅和认可,最终形成的正式文档,起到了对外公示的作用。
而 PEP 1 中给出了官方的 PEP 的定义,给出了 PEP 的三种类型,分别为:标准跟踪 (Standards Track) 的PEP、信息类 (Informational) PEP 和过程 (Process) PEP。
- 标准跟踪 PEP 描述了 Python 的一个新特性或实现,它还可能描述一个互操作性标准,在后续 PEP 在未来版本中添加标准库支持之前,该互操作性标准将在当前 Python 版本的标准库之外得到支持。
- 信息性 PEP 描述了 Python 设计问题,或者为 Python 社区提供了一般的指导方针或信息,但没有提出新的特性。信息性 PEP 不一定代表 Python 社区的共识或建议,因此用户和实现人员可以自由地忽略信息性 PEP 或听从他们的建议。
- 进程 PEP 描述围绕 Python 的进程,或建议对进程中的事件进行更改,类似于标准跟踪 PEP ,但适用于 Python 语言本身之外的其他领域。他们可能会提出一个实现,但不会提出 Python 的代码库,它们往往需要社区的共识,与信息性的 PEP 不同,它们不仅仅是建议,用户通常不能随意忽略它们。示例包括过程、指南、对决策过程的更改,以及对 Python 开发中使用的工具或环境的更改。
而虚拟环境搭建是在 PEP 405 中制定,这个 PEP 提议向 Python 添加一种轻量级“虚拟环境”机制,该环境具有自己的站点目录,可以选择与系统站点目录隔离。每个虚拟环境都有自己的 Python 二进制文件,允许使用各种 Python 版本创建环境,并且可以在其站点目录中有自己独立的已安装 Python 包,但是与已安装的 Python 基础共享标准库。
虚拟环境是个观念,而实现这个观念的工具在 Python 2 是 virtualenv, Python 是 venv,它允许我们创建独立的 Python 环境。假设有一个应用程序需要库的版本 2,但是另一个应用程序需要版本 3,我们要如何使用和开发这两个应用程序?如果你把所有东西都安装到 /usr/lib/python 2.7/site-packages (或者无论您的平台的标准位置是什么),很容易陷入无意中升级软件包的境地。在另一种情况下,假设有一个完全开发的应用程序,我们不想对它正在使用的库进行任何更改,但同时又要开始开发另一个需要这些库的更新版本的应用程序。
使用虚拟环境可以为我们的 Python 应用程序创建隔离环境,并允许在该隔离环境中安装 Python 库,而不是全局安装它们。归纳当然使用虚拟环境有几个优点:
- 不同项目可以使用不同版本的相同套件,且不互相影响。
- 启动虚拟环境后,pip 安装的套件会被放在虚拟环境中,每个项目就可以拥有一个独立的环境。
- 套件版本升级时不会影响到其他的项目。
- 在没有权限的情况下安装新套件。
安装 pip
pip 是 Python 的包管理器,用于安装和更新软件包,需要先确保安装了最新版本的 pip。
Windows
透过 Python 启动器检查确认pip的版本
py -m pip --version
pip 20.2.4 from D:\Python\Python37_64\lib\site-packages\pip (python 3.7)
安装并更新 pip 到最新版本
py -m pip install --upgrade pip
Linux 和 macOS
Debian 和大多数其他发行版包括一个 python-pip 包,如果您想使用 Linux 发行版提供的 pip 版本,可参考以下命令。
# CentOS/RHEL 发行版
sudo yum install python-pip
# Debian/Ubuntu/Amazon Linux 发行版
sudo apt install python3-pip
您也可以自己安装 pip,以确保您拥有最新版本。
python3 -m pip install --user --upgrade pip
python3 -m pip --version
pip 9.0.1 from $HOME/.local/lib/python3.6/site-packages (python 3.6)
安装虚拟环境包
如果使用的是 Python 3.3 或更高版本,venv 模块是创建和管理虚拟环境的首选方式,并已经内建在套件中,所以可以不用再安装,可以跳过这一部分。以下只针对 Python 2
在macOS和Linux
python3 -m pip install --user virtualenv
在Windows
py -m pip install --user virtualenv
创建虚拟环境
venv (Python 3) 和 virtualenv (Python 2) 允许您为不同的项目管理单独的包安装。它们本质上允许您创建一个“虚拟的”孤立的安装,并将软件包安装到该虚拟安装中。当您切换项目时,您可以简单地创建一个新的虚拟环境,而不必担心破坏安装在其他环境中的包。开发 Python 应用程序时,总是建议使用虚拟环境。
要创建虚拟环境,请转到项目目录并运行。如果您正在使用 Python 2,请在下面的命令中将 venv 替换成 virtualenv 。
在macOS和Linux
# for Python 2
python2 -m virtualenv envDir
# for Python 3
python3 -m venv envDir
在Windows
# for Python 2
py -m virtualenv envDir
# for Python 3
py -m venv envDir
第二个参数 envDir 是创建虚拟环境的文件夹,虚拟环境将创建在 envDir 文件夹中。
激活虚拟环境
在虚拟环境中安装或使用软件包之前,需要使激活它,激活虚拟环境需将 Python 和 pip 的可执行文件的文件夹放入系统的 PATH 环境变量中。激活文档是个草稿文件,可以直接打开内文检视。
在macOS和Linux
source envDir/bin/activate
在Windows
.\envDir\Scripts\activate.bat
您可以通过检查 Python 解释器的位置来确认您在虚拟环境中,第一笔应该指向 envDir 目录,如果还有其他 Python 解释器,也会全部列出。
在macOS和Linux
which python
.../envDir/bin/python
在Windows
where python
D:\czcit\envDir\Scripts\python.exe
D:\Python\Python37_64\python.exe
D:\Python\Python27\python.exe
只要您的虚拟环境被激活,pip 就会将包安装到特定的文件夹中,如 envDir\Lib, envDir\Include, envDir\Scripts 中,您就可以在您的 Python 应用程序中导入和使用包。
离开虚拟环境
如果您想切换项目或离开虚拟环境,只需运行 deactivate 这个草稿文件即可:
deactivate
如果您想重新进入虚拟环境,请按照上面关于激活虚拟环境的相同说明进行操作。没有必要重新创建虚拟环境。
安装软件包
现在您已经进入虚拟环境,可以安装软件包了。让我们从清华大学的镜像 Python 包索引(Python Package Index, PyPI)服务器中安装特定版本的 requests (2.18.4) 包,因为在前面我们已经设定过全域变量,所以可以不用在设定。
# 如果已经设定过就可以不用运行此行指令,因为这是全域环境变量
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
(envDir) D:\czcit>pip install requests==2.18.4
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting requests==2.18.4
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/49/df/50aa1999ab9bde74656c2919d9c0c085fd2b3775fd3eca826012bef76d8c/requests-2.18.4-py2.py3-none-any.whl (88 kB)
Collecting certifi>=2017.4.17
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/5e/a0/5f06e1e1d463903cf0c0eebeb751791119ed7a4b3737fdc9a77f1cdfb51f/certifi-2020.12.5-py2.py3-none-any.whl (147 kB)
|████████████████████████████████| 147 kB 819 kB/s
Collecting chardet<3.1.0,>=3.0.2
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133 kB)
Collecting idna<2.7,>=2.5
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/27/cc/6dd9a3869f15c2edfab863b992838277279ce92663d334df9ecf5106f5c6/idna-2.6-py2.py3-none-any.whl (56 kB)
Collecting urllib3<1.23,>=1.21.1
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/63/cb/6965947c13a94236f6d4b8223e21beb4d576dc72e8130bd7880f600839b8/urllib3-1.22-py2.py3-none-any.whl (132 kB)
Installing collected packages: urllib3, idna, chardet, certifi, requests
Successfully installed certifi-2020.12.5 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22
pip 会应该下载 requests 包及其所有依赖项并安装它们,透过 pip show requests 可以观察 requests 的版本,接着运行 deactivate 离开这个虚拟环境,在检查一下 requests 的版本,可以发现,第一次检查的版本是 2.18.4 而第二次检查到的版本是 2.25.0,说明了两个包的不同。
(envDir) D:\czcit>pip show requests
Name: requests
Version: 2.18.4
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: d:\czcit\envdir\lib\site-packages
Requires: chardet, certifi, urllib3, idna
Required-by:
(envDir) D:\czcit>deactivate
D:\czcit>pip show requests
Name: requests
Version: 2.25.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: c:\users\user\appdata\roaming\python\python37\site-packages
Requires: chardet, idna, certifi, urllib3
Required-by: yarg
而进入 D:\czcit\envDir\Lib\site-packages ,也可以发现刚刚安装的包都放在这个文件夹中
D:\czcit>dir D:\czcit\envDir\Lib\site-packages
...
Directory of D:\czcit\envDir\Lib\site-packages
2020/12/07 15:59 <DIR> .
2020/12/07 15:59 <DIR> ..
2020/12/07 15:59 <DIR> certifi
2020/12/07 15:59 <DIR> certifi-2020.12.5.dist-info
2020/12/07 15:59 <DIR> chardet
2020/12/07 15:59 <DIR> chardet-3.0.4.dist-info
2020/12/07 15:42 126 easy_install.py
2020/12/07 15:59 <DIR> idna
2020/12/07 15:59 <DIR> idna-2.6.dist-info
2020/12/07 15:55 <DIR> pip
2020/12/07 15:55 <DIR> pip-20.3.1.dist-info
2020/12/07 15:42 <DIR> pkg_resources
2020/12/07 15:59 <DIR> requests
2020/12/07 15:59 <DIR> requests-2.18.4.dist-info
2020/12/07 15:42 <DIR> setuptools
2020/12/07 15:42 <DIR> setuptools-47.1.0.dist-info
2020/12/07 15:59 <DIR> urllib3
2020/12/07 15:59 <DIR> urllib3-1.22.dist-info
2020/12/07 15:42 <DIR> __pycache__
项目移值
将上一节的项目移植到这个虚拟环境只需要提供 requirements.txt 和 plot2Exe.py 这两个文档即可,运行以下命令即可完成项目移植
# 安装项目所需类库包
pip install -r requirements.txt
# 运行项目
python plot2Exe.py
图 5-1-1 完成 Python 项目移植