当我们开发多个应用程序时,可能各应用程序依赖不同版本的工具包。比如应用A需要requests2.21.0 ,而应用程序B需要requests2.23.0。那么每个应用可能需要各自拥有一套“独立”的Python运行环境,下面梳理venv, virtualenv, pipenv 三个工具的使用。
venv
venv为Python内置模块,用于创建和管理虚拟环境的。
-
安装
最新版本的 Python,venv通常会自带安装完成。
Python3.3增加了venv模块, Python3.5对venv进行了改进,3.5+ 版本官方推荐使用venv作为管理虚拟环境的工具。
如果系统上有多个版本的 Python,可以通过运行python3
或您想要的任何版本来选择特定的Python版本。python3 -m venv tutorial-env
将创建 tutorial-env 目录,并在其中创建包含Python解释器,标准库和各种支持文件的副本的目录。
虚拟环境的常用目录位置是 .venv。 这个名称通常会令该目录在终端中保持隐藏。 -
激活虚拟环境
在Unix或MacOS上,运行:
source tutorial-env/bin/activate
激活成功后将更改Shell提示符,以显示正在使用的虚拟环境:
(tutorial-env)Mac:python_basic Sunny$
在Windows上,运行:
tutorial-env\Scripts\activate.bat
退出虚拟环境
在Unix或MacOS上,运行:
(tutorial-env) SunnyiMac:bin Sunny$ deactivate
在Windows上,运行:
tutorial-env\Scripts\deactivate.bat
virtualenv
- 安装virtualenv
pip3 install -U virtualenv
以macosx为例
这里使用sudo是为了确保virtualenv命令行命令能安装成功,如果不用sudo可能由于权限问题而导致virtualenv模块安装成功,但无法通过命令行直接使用。$sudo pip3 install -U virtualenv
2.创建虚拟环境
第一步,创建目录:
Mac:~ Sunny$ mkdir python_basic
Mac:~ Sunny$ cd python_basic/
Mac:python_basic Sunny$
第二步,创建一个独立的Python运行环境,命名为py_basic
Mac:python_basic Sunny$ virtualenv --no-site-packages py_basic
命令virtualenv就可以创建一个独立的Python运行环境,加上了参数--no-site-packages,这样,已经安装到系统Python环境中的所有第三方包都不会复制过来,这样,就得到了一个不带任何第三方包的“干净”的Python运行环境。
备注: 新版本virtualenv 已没有--no-site-packages 参数,默认创建的就是"干净"Python运行环境
3.激活虚拟环境
Mac:python_basic Sunny$ source py_basic/bin/activate # sh, bash, ksh, or zsh
(py_basic)Mac:python_basic Sunny$
注意命令提示符变化,有个(py_basic)前缀,表示当前环境是一个名为py_basic的Python环境
(py_basic)Mac:python_basic Sunny$pip install --upgrade pip # 更新虚拟环境的pip
(py_basic)Mac:python_basic Sunny$pip list # 查看虚拟环境内已安装的工具包
4.退出虚拟环境
(py_basic)Mac:python_basic Sunnyl$ deactivate
Mac:python_basic Sunny$
通过virtualenv完全可以针对每个应用创建独立的Python运行环境,这样就可以对每个应用的Python环境进行隔离。
virtualenv是实现“独立”的Python运行环境的原理:
- 把系统Python复制一份到virtualenv的环境。
- 用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。
pipenv
pipenv 是Python官方推荐的包管理工具
pipenv 目的旨在将包管理领域最有优秀的理念与功能引入到Python世界中来。
pipenv将自动为项目创建和管理虚拟环境,并在安装/卸载模块包时从Pipfile中添加/删除模块包,生成Pipfile.lock来锁定安装包的版本和依赖信息,避免构建错误,确保稳定构建
pipenv主要解决如下几方面问题:
- 集成pip 和virtualenv 两个工具功能,不再需要单独去使用它们,可以通过pipenv让它们一切协同工作。
- 针对管理requirements.txt文件可能会出现问题,pipenv使用Pipfile和Pipfile.lock代替requirements.txt
- 引入哈希机制,哈希无处不在,提升安全;并确保自动公开安全漏洞。
- 引入模块包依赖关系图,依赖关系一眼可见
- 通过加载.env文件简化工作流程。
pipenv依赖virtualenv
1. 安装
为了方便使用, 建议全局安装
$ pip install pipenv
2. 使用
通过pipenv创建一个虚拟环境与项目(文件夹)绑定
在项目目录下执行:
- pipenv install
创建虚拟环境并与项目目录绑定
SunnyiMac:pip-env Sunny$ pipenv install
Creating a virtualenv for this project…
Pipfile: /Users/Sunny/SunnyLearn/IT/Python/python_venv/pip-env/Pipfile
Using /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 (3.6.8) to create virtualenv…
⠴ Creating virtual environment...created virtual environment CPython3.6.8.final.0-64 in 1010ms
creator CPython3Posix(dest=/Users/Sunny/.local/share/virtualenvs/pip-env-LlWfIOtH, clear=False, global=False)
seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=/Users/Sunny/Library/Application Support/virtualenv/seed-app-data/v1)
activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
✔ Successfully created virtual environment!
Virtualenv location: /Users/Sunny/.local/share/virtualenvs/pip-env-LlWfIOtH
Creating a Pipfile for this project…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (ca72e7)!
Installing dependencies from Pipfile.lock (ca72e7)…
🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
SunnyiMac:pip-env Sunny$ ls
Pipfile Pipfile.lock
- pipenv shell
激活虚拟环境,若没有找到绑定虚拟环境将自动创建虚拟环境并激活该虚拟环境。
SunnyiMac:pip-env Sunny$ pipenv shell
Launching subshell in virtual environment…
bash-3.2$ . /Users/Sunny/.local/share/virtualenvs/pip-env-LlWfIOtH/bin/activate
(pip-env) bash-3.2$
退出pipenv环境
$ exit
说明:
个人理解pipenv在使用过程中,和virtaulenv不同:virtaulenv需要激活进入虚拟环境,pipenv使用过程中比如安装包其实不需要激活虚拟环境,在当前目录操作其实就是在操作本目录下绑定的虚拟环境。
pipenv install somepackage
在虚拟环境下安装包,若没有找到绑定虚拟环境将自动创建虚拟环境。
$pipenv install flask
既然已经隔离的为什么不直接用pip 安装 Flask ,而是用pipenv, 个人判断两个都是可以达到目的;原因猜测pipenv本就是希望一个命令通行天下)`
同时修改Pipfile, Pipfile.lockpipenv uninstall somepackage
在虚拟环境下卸载包
$ pipenv uninstall flask
同时修改Pipfile, Pipfile.lockpipenv graph
查看安装包的依赖关系
$ pipenv graph
pipenv clean
清理安装包,删除没有在Pipfile.lock中指定的包
$ pipenv clean
pipenv lock
生成lockfile
$ pipenv lock
pipenv --rm
删除一个虚拟环境
$pipenv --rm
3.扩展
-
添加shell补齐
如果使用的是bash
, 可添加下面语句到.bashrc
或.bash_profile
eval "$(pipenv --completion)"
个人推荐使用下面方式实现命令行补齐支持:
$ pipenv --completion >> ~/.bash_profile
为了安装指定版本的包信息,可以使用:
$ pipenv install requests==2.13.0
-
指定安装包的源
如果我们需要在安装包时,从一个源下载一个安装包,然后从另一个源下载另一个安装包,我们可以通过下面的方式配置[[source]] url = "https://pypi.python.org/simple" verify_ssl = true name = "pypi" [[source]] url = "https://mirrors.aliyun.com/pypi/simple/" verify_ssl = false name = "aliyun" [dev-packages] [packages] requests = {version="*", index="aliyun"} maya = {version="*", index="pypi"} records = "*"
设置了两个源:
同时指定requests
包从aliyun
源下载,maya
包从pypi
源下载
需要特别说明:
国内通过pypi源由于网络问题可能会出现Locking Failed!错误
Installing flask…
Adding flask to Pipfile's [packages]…
✔ Installation Succeeded
Pipfile.lock (f20c47) out of date, updating to (ef1c0c)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
✘ Locking Failed!
切换为国内源,马上解决,推荐使用阿里源
修改目录下的Pipfile文件
# [[source]]
# name = "pypi"
# url = "https://pypi.org/simple"
# verify_ssl = true
[[source]]
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple/"
verify_ssl = true
注意需要注释掉原有source,不然无论将阿里源的配置放在前面还时候后面都会有问题,关于具体原因,通过
pipenv -v install flask
可以看出一些端倪,需要进一步深入研究来最终确认问题。//TODO
3. 卸载pipenv
$ pip uninstall pipenv