虚拟环境是指为当前的 python 工程创建一个隔离的python环境(an isolated Python environment)。因为 python 的插件众多,为避免版本冲突,Python 建议通过虚拟环境工具为项目创建纯净的依赖环境

在 python 3.3 之前,只能通过 virtualenv 创建虚拟环境,3.3 之后,可以用模块 venv 代替 virtualenv 工具,好处时不用单独安装。本文介绍 venv 模块的用法。

创建虚拟环境

创建一个文件夹,进入文件夹后,打开命名行窗口,运行下面的命令:

python -m venv myvenv

该命令在当前的目录下创建名为 myvenv 的虚拟环境。我们进入 myvenv 文件夹,可以观察一下 myvenv 的文件夹结构,应该来说还是非常直观的。pyvenv.cfg 是虚拟环境的配置文件,这是一个文本文件,打开:

home = C:\Users\StoneWM\AppData\Local\Programs\Python\Python37
include-system-site-packages = false
version = 3.7.2

可以看出,配置文件中记录了 python 的路径和版本,虚拟环境是否使用系统的 site pakages。

激活虚拟环境

虚拟环境创建好后,需要激活才能在当前命令行中使用。以 Windows 为例,在 myvenv 文件夹下面的 Scripts 文件夹中:

  • activate.bat 是激活批处理文件
  • deactivate.bat 是关闭虚拟环境的批处理文件

在命令行环境下进入 Scripts 文件夹,运行 activate 批处理,退出虚拟环境很简单,只需要执行 deactivate 命令。

python dev文件 python中venv文件夹_python dev文件

Visual Studio Code 使用虚拟环境

在 Visual Studio Code 中,同时按下 Ctrl+Shift+P,在弹出的命令窗口中输入 interpreter,选择 Python: Select interpreter 命令,然后根据路径找到虚拟环境的 Python.exe 路径。

python dev文件 python中venv文件夹_python_02

之前已经打开的 terminal 不在虚拟环境中,不能自动切换,需要新增一个 terminal。有两个方法:

1)在 terminal 窗口中点击 + 号新增(或者:ctrl + shift + `)

python dev文件 python中venv文件夹_虚拟环境_03


新增的 terminal 显示如下:

python dev文件 python中venv文件夹_Python_04


2)通过 Ctrl + Shift + P,选择 Python: Create Terminal。

PyCharm 使用虚拟环境

PyCharm 使用默认环境和 VS Code 类似,可以选择一个已经存在的虚拟环境,或者创建一个新的虚拟环境。

python dev文件 python中venv文件夹_Python_05

虚拟环境中使用 pip

激活虚拟环境后,在虚拟环境中安装第三方包,这些第三方包都独立于该虚拟环境。在国内安装第三方包,建议配置国内镜像,方法如下。以 Windows 为例:

在 user 目录中创建一个 pip 目录 (C:\Users\StoneWM\pip),再新建文件 pip.ini,内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn

然后用 pip config list 命令检查是否成功:

python dev文件 python中venv文件夹_虚拟环境_06


如果只想临时使用一下,在 pip 命令后加上 -i 选项:

pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple

Linux/Mac OS 环境中,配置文件位置在 ~/.pip/pip.conf(如果不存在创建该目录和文件)。

国内 pip 常用的镜像地址:

  • 清华:https://pypi.tuna.tsinghua.edu.cn/simple
  • 阿里云:http://mirrors.aliyun.com/pypi/simple/
  • 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
  • 华中理工大学:http://pypi.hustunique.com/
  • 山东理工大学:http://pypi.sdutlinux.org/
  • 豆瓣:http://pypi.douban.com/simple/

部署虚拟环境

一般部署流程:

  • 开发完成后,使用 pip freeze > requirements.txt 命令将项目的库依赖导出,作为代码的一部分,然后将代码上传到服务器
  • 在服务器上创建一个虚拟环境
  • 在服务器端激活虚拟环境,执行 pip install -r requirements.txt,安装依赖

python 包管理历史

早期的时候,当用户想安装包时,需要先从网上把文件下载下来,解压,然后执行 Python setup.py install, 才能将包安装好。

后来有了 PyPI,开发者可以把他们的包上传到上面,然后其他开发者可以从这里下载他们需要的包,然后再执行 python setup.py install 进行安装,但是这样还是存在许多的问题,比如说:整个过程需要人工,不方便自动化,无法安装多个不同版本等等。

再后来有了 easy_install,当用户想要安装某个包的是否,只要执行 easy_install 包名,工具就会自动把包以及依赖下载下来进行安装,这解决了无法自动化的问题,但是这种方法的缺陷是,只能安装,却没有方法卸载

到了 2008 年,pip 出现了,还引入了 requirements files 的概念,可以使用户非常方便的复制 Python 环境。比如说安装某个包,执行 pip install 包名,需要卸载,执行 pip uninstall 包名,需要批量安装,执行 pip install -r requirements.txt。直到现在,pip 已经成为非常好用的包管理工具了。pip 解决了单个环境下的包管理问题,但是如果我们需要在一台机器上开发多个项目,这多个项目用到了相同包的不同版本,这就成了非常棘手的问题了。

为了解决这个问题,virtualenv 出现了。virtualenv 可以为每个项目创建一套隔离的 Python 环境,再使用 pip 进行包管理。目前 pip+virtualenv 是目前比较主流的 Python 开发流程。慢慢的这种方式也逐渐暴露出了缺点,比如 pip 的 requirements.txt 过于简单,没办法表示具体的依赖关系,需要使用两个工具(pip+virtualenv)才能完成工作。

为了解决这两个问题 pipenv 登场了,它主要使用 pipfile 来取代之前的 requirements.txt,pipfile 比requirements.txt 表达能力更强,默认支持两种依赖,可以将多个 requirements.txt 的内容合并到一起,方便管理,并且通过 pipfile.lock 对环境进行明确、详细的描述。pipenv 可以让你无缝的使用pipfile,pipfile.lock,保证每个依赖的信息都是明确的,它提供简洁的命令操作 virtualenv,并且提供很多辅助工具,比如 pipenv graph,可以显示项目的完整依赖关系。

目前 Pipenv 已经是Python官方推荐的工作流工具了。

(以上内容来自:包管理神器-pipenv )

参考

venv — 创建虚拟环境 — Python 3.9.6 文档包管理神器-pipenv - 寂静的天空