虚拟环境是指为当前的 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 命令。
Visual Studio Code 使用虚拟环境
在 Visual Studio Code 中,同时按下 Ctrl+Shift+P,在弹出的命令窗口中输入 interpreter,选择 Python: Select interpreter 命令,然后根据路径找到虚拟环境的 Python.exe 路径。
之前已经打开的 terminal 不在虚拟环境中,不能自动切换,需要新增一个 terminal。有两个方法:
1)在 terminal 窗口中点击 + 号新增(或者:ctrl + shift + `)
新增的 terminal 显示如下:
2)通过 Ctrl + Shift + P,选择 Python: Create Terminal。
PyCharm 使用虚拟环境
PyCharm 使用默认环境和 VS Code 类似,可以选择一个已经存在的虚拟环境,或者创建一个新的虚拟环境。
虚拟环境中使用 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 命令检查是否成功:
如果只想临时使用一下,在 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 - 寂静的天空