Python虚拟环境venv模块

Python虚拟环境venv模块
墨颜丶原文链接: Python 虚拟环境 看这一篇就够了
虚拟环境概述
Python应用程序通常会使用不在标准库内的软件包和模块。应用程序有时需要特定版本的库,修复特定的错误,或者可以使用库的过时版本的接口编写应用程序。
这说明一个Python安装可能无法满足每个应用程序的要求。例如:应用程序A需要特定模块的1.0版本但应用程序B需要2.0版本,则需求存在冲突,安装版本1.0或2.0将导致某一个应用程序无法运行。
这个问题的解决方案是创建一个虚拟环境,一个目录树,其中安装有特定Python版本,以及其他包。
不同的应用将可以使用不同的虚拟环境。就可以解决需求相冲突的例子。
基本概念
下面是一些基本概念:
- PyPA:指 Python Packaging Authority,一个维护 Python 打包相关项目的小组,相关项目具体见 https://github.com/pypa。
- pip:Python 包安装器。
- virtualenv:Python 虚拟环境管理工具。
- venv:Python 标准库内置的虚拟环境管理工具,Python 3.3 加入,Python 3.5 开始作为管理虚拟环境的推荐工具,用法类似 virtualenv。如果你使用 Python 3,推荐使用 venv 来替代 virtualenv。
python 包管理器
软件包源中的软件包数量巨大,版本多样,所以需要借助于软件源管理工具,例如 pip、conda、Pipenv、Poetry 等
- pip 是最常用的包管理工具,通过
pip install <packagename>
命令格式来安装软件包,使用的是 pypi 软件包源 - conda 多用作科学计算领域的包管理工具,功能丰富且强大,使用的软件包源是 Anaconda repository 和 Anaconda Cloud,conda 不仅支持 Python 软件包,还可以安装 C、C++ 、R 以及其他语言的二定制软件包。除了软件包管理外,还能提供相互隔离的软件环境。
- Pipenv 是 Kenneth Reitz 在2017年1月发布的Python依赖管理工具,现在由PyPA维护。Pipenv 会自动帮你管理虚拟环境和依赖文件,并且提供了一系列命令和选项来帮助你实现各种依赖和环境管理相关的操作
- Poetry 和 Pipenv 类似,是一个 Python 虚拟环境和依赖管理工具,另外它还提供了包管理功能,比如打包和发布。你可以把它看做是 Pipenv 和 Flit 这些工具的超集。它可以让你用 Poetry 来同时管理 Python 库和 Python 程序
很多包管理工具不仅提供了基本的包管理功能,还提供了虚拟环境构建,程序管理的等功能
virtualenv 工具
在 python3.3 之前,只能通过 virtualenv 创建虚拟环境,首先需要安装 virtualenv
1 | pip install virtualenv |
安装完后,在当前目录下创建一个名为 myvenv 的虚拟环境:
1 | virtualenv --no-site-packages myvenv |
参数 --no-site-packages
的意思是创建虚拟环境时,不复制主环境中安装的第三方包,也就是创建一个 “干净的” 虚拟环境
virtualenv 还有很多参数,用于不同的使用场景,例如:
- -p: 用于指定 Python 解析器,就是安装好的 Python 应用程序,默认为当前环境中的 Python
- –no-pip:不需要安装 pip,默认为安装
- –clear:如果创建虚拟环境的目录已经有了其他虚拟环境,清楚重建
命令 | 参数 | 作用 |
---|---|---|
workon | 列出当前系统中所有的虚拟环境 | |
workon <虚拟环境名称> | 进入执行名称的虚拟环境中 | |
mkvrualenv <虚拟环境名称> | -p指定python解析器版 | |
deactivate | 在虚拟环境内部退出环境 | |
pip freeze | 列出当前环境下开发者使用pp安装的包列表,作用类似于。pip list,但是比pip list好用 | |
pip freeze >requriments.txt | requriments.txt是瞎写 | 备份虚拟环境中的所有依赖包列表 |
pip install r ./requriments.txt | 还原备份的虚拟环境包列表 | |
rmvirtualenv <虚拟环境名称> | 删除指定名称的虚拟环境[慎更使用,删除前建议备份] |
venv 模块
Python3.3 之后,可以用模块 venv 代替 virtualenv 工具,好处是不用单独安装,3.3 及之后的版本,都可以通过安装好的 Python 来创建虚拟环境:
1 | python -m venv myvenv |
可以在当前目录创建一个名为 myvenv 的虚拟环境
venv 有些参数,不过相比 virtualenv 少了些,这里简单介绍几个:
- –without-pip: 不需要安装 pip,默认为安装
- –clear:如果创建虚拟环境的目录已经有了其他虚拟环境,清楚重建
因为 venv 是依附于一个 Python 解析器创建的,所以不需要指定 Python 解释器版本
激活
虚拟环境创建好后,需要激活才能在当前命令行中使用,可以理解成将当前命令行环境中 PATH 变量的值替换掉
通过 virtualenv 和 模块 venv 创建的虚拟环境,激活方式是一样的,即运行激活脚本
Windows 系统中,激活脚本路径是
<myvenv>\Scripts\activate.bat
,如果是 powershell 命令行,脚本换成Activate.ps1
, 注意将<myvenv>
换成你自己的虚拟环境目录Linux 系统中,激活脚本路径是
<myvenv>/bin/activate
,默认脚本没有执行权限,要么设置脚本为可执行,要么用source
命令执行,例如1
$ source myvenv/bin/activate
激活后,可以在命令行中看到虚拟环境标记,如上图
打印 PATH,命令如下:
Linux 下:
1 | echo $PATH |
Windows 下
1 | echo %PATH% |
可以看到创建的虚拟环境脚本目录被加载了最前面
退出
退出虚拟环境很简单,只需要执行 deactivate
命令就行,这个命令也在虚拟环境的脚本目录下,因为激活时,将脚本目录设置到 PATH 中了,所以可以直接使用
退出虚拟环境相当于将 PATH 恢复成原来的
与开发工具配合
虽然通过激活脚本,很容易切换到虚拟环境,但是在实际开发中,还是不够方便,而且现在很多开发工具,特别是提供 Python 解析环境的开发工具,都可以和虚拟环境配合,在开发过程中几乎无感,对开发工作是很大的帮助
Visual Studio Code
VS Code 是个后起之秀,功能强大且具有丰富的插件资源,无疑是这两年发展最快的综合开发工具。现在的版本配置 Python 虚拟环境很简单,只需要选择一个 Python 解释器就好了
同时按下 Ctrl+Shift+P, 在弹出的命令窗口中输入 “解析器”,然后在下拉列表中选择 “Python:选择解析器”,这里会缓存一些已经创建好的解析器,如果没有想要的,可以选择 “Enter interpreter path” 来选择解析器路径,即已经创建好的虚拟环境脚本文件夹中的 Python 程序,就可以创建一个新的解析器
选择 Python 解析器
如果编辑的是 Python 代码文件,在状态栏中也可以选择和切换解释器,更为方便
选择 Python 解析器
Pycharm
Pycharm 应该是功能最好的 Python 开发工具,转为 Python 开发而生,除了基本的开发功能外,还提供项目创建、打包、测试等丰富功能,有很大的市场占有率
创建项目时,在项目创建对话框中,可以创建或者选择已经已有的解析器
选择 Python 解析器
选择创建新的解析器时,需要选择创建虚拟环境的工具,如 virtualenv;指定虚拟环境的目录;选择 Python 基础解析器,同 virtualenv 工具的 -p 参数的效果;以及是否要继承基础解析器的第三方库 和 是否将这个虚拟环境作为默认环境,即创建其他项目时默认选择
如果选择已存在的解析器,和 VS Code 差不多,可以选择已经缓存的或者指定解析器的路径
部署虚拟环境
之所以在开发时选择虚拟环境,除了避免库之间的冲突,还有重要的原因是方便部署,因为虚拟环境是独立的,仅包含了项目相关的依赖库,所以部署的效率更高,风险更小
一般部署流程是:
- 开发完成后,使用
pip freeze > requirements.txt
命令将项目的库依赖导出,作为代码的一部分 - 将代码上传到服务器
- 在服务器上创建一个虚拟环境
- 激活虚拟环境,执行
pip install -r requirements.txt
,安装项目依赖
怎么运行项目,需要看项目的具体情况
- Web 项目 Web 项目一般使用 Django、Flask 的 Web 开发的提供 Web 服务的项目,部署时需要一个 Web 容器,作为程序的运行环境,容器的配置中都有一个虚拟环境的设置,其实是指定 Python 解析器的路径,将其设置为虚拟环境的目录或者 Python 解析器就可以了,启动时就用使用虚拟环境,并与其他环境隔离。例如 uWSGI 配置文件中 home 参数是用来指定解析器的。
- 服务类项目 服务类项目就是需要以服务的形式长时间运行的,例如之前介绍的 公交闹钟,或者一些定时爬虫之类的,对于 Linux 而言,当前主流的服务方式是 Systemd,是一种比 init 更先进的服务管理工具,在服务脚本中, 设置 ExecStart 执行命令为全路径的虚拟环境的 Python 解析器,服务启动时,使用独立的虚拟环境了。Windows 服务,对于达成 EXE 包的,不需要配置虚拟环境,因为打包时已经考虑了环境问题了,如果是脚本运行的话,需要指定全路径的 Python 解析器
- 单次运行项目 对于一些测试或者实验性质的项目,大多数情况下手动执行,只要在激活的虚拟环境下,或者用特定的 Python 解析器运行就好了,和在开发过程中运行区别不大
其他虚拟环境管理工具
- virtualenvwrapper:是对 virtualenv 的一个封装,还有针对 vim 用户和 emacs 用户的 扩展,能支持 bash/ksh/zsh
- virtualenvwrapper-win:针对 Windows batch shell 的 virtualenvwrapper
- pyenv:用来解决这类问题。它可以安装、卸载、编译、管理多个 python 版本,并随时将其中一个设置为工作环境
- pyenv-win:针对 Windows 的 pyenv
有兴趣的话可以试用一下
从其他工具迁移回来
如果你想从 Pipenv 迁移回来,方法很简单,只需要生成一个 requirements.txt 文件即可。使用下面的命令生成一般依赖列表:
1 | $ pipenv lock -r |
使用下面的命令输出开发依赖列表:
1 | $ pipenv lock -r --dev |
然后手动把两个命令的输出保存为 requirements.txt 和 requirements-dev.txt。
从 Poetry、Conda 等其他工具迁移回来可以使用 pipreqs 来生成 requirements.txt,它会基于项目代码的导入语句来生成依赖列表。
总结
今天主要了解了 Python 虚拟环境的相关概念和工具,并简单描述了实际工作中的一些使用方式,以便能在开发过程中使用。限于篇幅,没法就更多的内容详细展开,需要在实践中多试多用,Just DO It!
Anaconda
比如有两个项目,里边的模块版本基本一致,生成两套环境有点冗余,Anaconda就解决了这一问题
也是一个虚拟环境管理工具,anaconda在virtualenv 的基础上,提取了公共代码保存到一个公共目录,独立代码才会分离开来。
1 | # 查看当前Anaconda的系统配置信息 |
报错原因:默认从国外镜像源下载,而从国外下载速度极慢,导致报错
解决办法:使用清华镜像,下面是添加清华镜像至Anaconda仓库的方法
1 | ## 报错超时 |
1 | ## 在自己的用户目录下`eg:C:\Users\User\.condarc`,修改配置为清华源并保存 |