1 概念
- 一个独立的局部的 Python 环境
- 完全模拟系统全局 Python 环境的使用,如安装、卸载包到逻辑操作等
2 作用
- 让项目运行在一个独立的局部的 Python 环境中,使采用不同环境的项目互不干扰。
3 安装虚拟环境
- virtualenv,就是一个三方包
- 安装命令,pip install virtualenv
- 使用文档,https://virtualenv.pypa.io/en/stable/userguide/
安装过程中,如果出现如下 error 信息是,可以尝试切换源重新下载
阿里源,不行
$ pip install virtualenv
Looking in indexes: http://pypi.douban.com/pypi/simple
Collecting virtualenv
The repository located at pypi.douban.com is not a trusted or secure host and is being ignored. If this repository is available via HTTPS we recommend you use HTTPS instead, otherwise you may silence this warning and allow it anyway with '--trusted-host pypi.douban.com'.
Could not find a version that satisfies the requirement virtualenv (from versions: )
No matching distribution found for virtualenv
豆瓣源,不行
$ pip install virtualenv --trusted-host pypi.douban.com
Looking in indexes: http://pypi.douban.com/pypi/simple
Collecting virtualenv
Could not find a version that satisfies the requirement virtualenv (from versions: )
No matching distribution found for virtualenv
官方源,不行
$ pip install virtualenv -i https://pypi.python.org/simple/
Looking in indexes: https://pypi.python.org/simple/
Collecting virtualenv
Downloading https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c35d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl (1.9MB)
4% |█▌ | 92kB 2.7kB/s eta 0:11:08Exception:
Traceback (most recent call last):
....
pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.
清华源,可以
$ pip install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple/
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple/
Collecting virtualenv
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/ed/ea/e20b5cbebf45d3096e8138ab74eda139595d827677f38e9dd543e6015bdf/virtualenv-15.2.0-py2.py3-none-any.whl (2.6MB)
100% |████████████████████████████████| 2.6MB 4.1MB/s
Installing collected packages: virtualenv
Successfully installed virtualenv-15.2.0
4 使用虚拟环境
4.1 创建一个局部的隔离的虚拟环境
4.1.1 创建命令:virtualenv 虚拟环境名称
virtualenv ENV
- cd 到存放虚拟环境的的地址
- 执行命令virtualenv ENV,创建名为ENV 的虚拟环境
% cd /Users/xxx/Desktop/testvirtuals
% virtualenv virtual1
Using base prefix '/usr/local/Cellar/python3/3.6.4_1/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/xxx/Desktop/testvirtuals/virtual1/bin/python3.6
Also creating executable in /Users/xxx/Desktop/testvirtuals/virtual1/bin/python
Installing setuptools, pip, wheel...done.
创建虚拟环境结果
注意:
-
Using base prefix
使用的是3.6版本环境,原因是 virtualenv 安装位置就在3.6下,所以默认使用的是其安装位置版本的 Python 环境 - 虚拟环境文件包括:Python解析器,包管理工具(setuptools, pip, wheel),三方包等
- 即使创建的 bin 脚本命令集含有 python 和 python3两个脚本,实际它们的版本都是3.6,这个防止使用者理解不足导致已为使用 python 命令时是使用 Python2.x 版本。
% /Users/xxx/Desktop/testvirtuals/virtual1/bin/python3 --version
Python 3.6.4
% /Users/xxx/Desktop/testvirtuals/virtual1/bin/python --version
Python 3.6.4
4.1.2 指定 Python 版本创建虚拟环境
可选参数:-p
指定 Python2.x 版本创建虚拟环境
virtualenv -p /usr/local/bin/python2.7 testvirtual2
执行效果
$ virtualenv -p /usr/local/bin/python2.7 ENV
Running virtualenv with interpreter /usr/local/bin/python2.7
New python executable in /Users/minyu_leung/Desktop/virtual2/ENV/bin/python2.7
Also creating executable in /Users/minyu_leung/Desktop/virtual2/ENV/bin/python
Installing setuptools, pip, wheel...done.
4.1.3 是否继承系统三方库 --system-site-packages
添加参数--system-site-packages
,项目检索库的时候,也会到系统的三方库中找
不添加时,默认只到虚拟环境中查找库
virtualenv --system-site-packages ENV
4.2 激活/退出 虚拟环境
在 Mac 下,激活所创建的虚拟环境步骤:
- cd 到虚拟环境文件夹目录
cd /Users/xxx/Desktop/testvirtuals/virtual1
- 执行命令 source bin/activate,shell 会打印出已激活的虚拟环境名称
$ source bin/activate
(virtual1)
-
验证当前确实在已激活的虚拟环境中,执行命令 pip --version 和 pip list
退出虚拟环境,在激活的虚拟环境中,执行命令 deactivate
$ deactivate
-
验证已经退出,执行命令 pip --version 和 pip list
-
注意:如果系统是 Windows 的话,则不需要带上 source 命令,直接 cd 进入Scripts脚本文件夹中,然后执行 activate 和 deactivate 脚本即可。与 Mac 不同的是,虚拟环境的 bin 目录下只有 activate 脚本,没有 deactivate 脚本。
使用文档中也有说 source 使用原因:
4.3 在激活状态下,操作
- 操作三方块
pip install requests - 执行 py 文件
python xx.py
以上操作均作用在虚拟环境中。
4.4 删除虚拟环境
- 直接删除虚拟环境所在目录即
4.5 项目交接
场景:确保共享的项目能够在其他电脑上正常运行
解决:
- 方案一:
- 连同虚拟环境和项目一起拷贝给他人
- 方案二:
- 在虚拟环境中,冻结依赖需求文本
- 把项目和依赖需求文本给他人
- 他人在本地创建一个新的虚拟环境,并根据依赖需求文本安装相关库
技能点:
- 虚拟环境的创建
- 虚拟环境的激活
- 操作虚拟环境
- 冻结项目需求文本 pip freeze > requirements.txt
- 根据需求文本,安装项目依赖库 pip install -r requirements.txt (在激活的虚拟环境中)
5 Pycharm 中使用虚拟环境
-
创建项目
-
在创建项目时,使用虚拟环境
创建后,目录结构
-
在项目偏好设置里可以切换环境和安装需要的库
总结:
IDE 让虚拟环境的使用更加方便,图形化创建和切换,包的管理等。让程序员更关注项目的开发而非各种命令的记忆。
6 虚拟环境进阶使用
6.1 集中式虚拟环境管理
virtualenvwrapper
使用文档
- 通过virtualenvwrapper创建的虚拟环境都会统一存放到指定位置统一管理
- 方便在多个虚拟环境间切换
- 更加方便的去使用 virtualenv
- 快速创建虚拟环境并激活
mkvirtualenv venv1
- 快速在多个虚拟环境中切换
workon venv2
- 快速关闭虚拟环境
deactivate
- 快速删除虚拟环境
rmvirtualenv env1
- 查看所有创建的虚拟环境
lsvirtualenv
弊端
- 只是对 virtualenv 的使用封装,包的安装及虚拟环境的操作依然是分离的。
- 并未具备对项目包的依赖管理及需求文本的生成操作封装
6.2 更加基于项目的虚拟环境管理
6.2.1 pipenv 使用优点
- 推荐使用:pipenv,是 pip + virtualenv 结合体,解决了virtualenvwrapper弊端
- 会自动帮你创建虚拟环境,以及安装三方库
- 会自动的记录你的项目依赖的所有三方库
- 使用 pipfile 和 pipfile.lock取代了 requirements.txt
使用文档
使用文档2
pipenv 命令使用一览
pipenv 命令都是参照项目中的 Pipfile 位置和内容操作的,类似 cocoapods 的 pod 命令参照podfile文件操作。
6.2.2 使用步骤
6.2.2.1 创建虚拟环境
1. cd 到项目文件夹目录下
2. 在该目录下执行命令
pipenv --two # 指定参照Python版本
或
pipenv --three
3. 查看相关信息
查看位置:pipenv --where
查看虚拟环境位置:pipenv --venv
查看解析器信息:pipenv --py
6.2.2.2 激活虚拟环境
pipenv shell
6.2.2.3 在激活状态下操作
- 执行 py 文件,python xx.py ,其中 python 指的是虚拟环境 Python版本
- 安装包
pipenv install requests
注意:不要使用 pip install 命令,使用的话虽然可以在虚拟环境中安装对应的包,但是不会更新 PIPfile 和 PIPfile.lock
命令:pipenv install [三方库名]
作用:
一、检测当前项目对应的虚拟环境是否存在,不存在则创建。如果当前项目已经存在 Pipfile 和 Pipfile.lock 文件,则参照这两个文件内容创建虚拟环境并安装文件指定的三方库
二、在虚拟环境中安装指定三方库,如果没有指定,则不安装
三、在项目目录下,通过 Pipfile 和 Pipfile.lock 记录当下已经安装的三方库信息
- 查看包的依赖结构
pipenv graph
- 卸载包
pipenv uninstall requests
6.2.2.4 退出虚拟环境
exit
或
直接关闭 shell 窗口
6.2.2.5 删除虚拟环境
先 cd 进入 Pipfile 文件目录位置
pipenv --rm
6.3 项目交接
6.3.1 上传项目时,应该包含的文件有?
应该包括文件有:
- 包和模块源码
- Pipfile 和 Pipfile.lock
6.3.2 拿到共享的项目后如何操作?
操作步骤:
- cd 进入获取的项目文件夹目录内
- 检查项目是否具有Pipfile 和 Pipfile.lock 文件 (此处应该是必须有的,因为是执行上述分享操作的人给你的项目嘛♪(∇*)啦啦)
- 执行命令:
pipenv install