Python—pipenv精心整理教程
前言
关于Python虚拟环境管理,很多人一开始不以为意,把编程时所有依赖的库全安装在一起,要用的时候直接导入,看似非常方便,但是会造成很多隐患:
- 当电脑/服务器里面的项目越来越大,更新迭代次数多了,会造成很多以前用到现在不需要用到的库,把这些库都写在requirements里面会造成冗余,而且docker化的时候安装requirements特别慢;
- 当电脑/服务器里面的项目越来越多,会造成很多项目的依赖库的版本相互冲突,而且也不敢随便删掉/更新某些库,因为有可能会造成某个项目的依赖无法找到或者版本不兼容的故障; 所以,Python在实际项目应用当中,虚拟环境管理是非常重要的
Python虚拟环境管理工具的发展
随着越来越多的python用于实际项目开发中,Python的虚拟环境管理工具出行了很多,最常用的便是virtualenv,virtualenvwrapper,pipenv这几种,事实上,这几种虚拟环境的管理都是基于virtualenv,只是做了不同的封装,达到了更好的效果。
- virtualenv ,此工具会在项目目录下创建一个文件夹,名字叫做virtualenv_name,此目录下会包含python拷贝,之后所有的依赖都会保存至此目录中,在虚拟环境激活状态下,可以安装所需的依赖包,安装的依赖包会保存至项目虚拟环境目录virtualenv_name 下,不会污染系统全局环境;
- virtualenvwrapper ,virtualenvwrapper是对virtualenv接口的封装。virtualenvwrapper会将虚拟环境的目录统一保存,不需手动管理,使用起来更加便利;
- pipenv ,pipenv是Kenneth Reitz在2017年1月发布的Python依赖管理工具,现在由PyPA维护。你可以把它看做是pip和virtualenv的组合体,而它基于的Pipfile则用来替代旧的依赖记录方式(requirements.txt),pipenv 在易用性上要简单很多,同时增加了 lock 文件,能更好的锁定版本。如果没有特殊要求可以 pipenv 直接使用 lock 的版本,开发又可以小步迭代,实现依赖的稳步升级。
pipenv的优势
- pipenv会在项目目录下创建Pipfile和Pipfile.lock文件,可以更好的管理包之间的依赖关系,以前我们需要将虚拟环境依赖包的导出为requirements.txt, 一旦依赖包变动,就要重新导出,现在Pipfile和Pipfile.lock文件可以节省这些步骤,更方便地管理;
- 安装卸载包无需激活虚拟环境,直接在项目文件夹下即可操作;
- 卸载的时候,可以自动检查依赖库是否被其他包依赖,来选择是否彻底删除。也可以通过 pipenv graph 来查看各个包的依赖关系图;
- 当代码需要在虚拟环境执行时,通过pipenv run python xx.py,即可在虚拟环境下执行python文件。如果需要在当前命令行持续执行虚拟环境下任务,可以通过pipenv shell 生成新的shell,此shell即处于虚拟环境激活状态,可以持续在虚拟环境下执行任务;
- 便于docker容器化管理,Pipfile文件支持生成requirements文件,便于项目代码docker化管理,另外,pipfile还支持--dev环境,可以在调试阶段安装许多调试工具等,而不影响生产环境的环境。
pipenv使用教程
-
安装pipenv
sudo pip install pipenv注:无法用pip管理的包,pipenv同样无法使用。 pipenv依赖:psutil, virtualenv-clone, pew, certifi, urllib3, chardet, requests, mccabe, pyflakes, pycodestyle, flake8等第三方模块。 -
初始化
cd <your_project>pipenv install该命令会初始化在你的项目根目录下生成pipfile文件 -
查看pipfile文件
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[packages]
[dev-packages]
- 在packages下填入的库和版本是可以用于生产环境和生成requirements文件的,在dev-packages下的则可以安装一下调试工具、性能测试工具、python语法工具等
- 完成填写pipfile文件的项目依赖库
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[packages]
django= "==2.0.6"
requests = "*" //*表示接受任何版本,默认安装最新版
[dev-packages]
然后执行pipenv install即可生成Pipfile.lock文件
当然上述步骤也可直接用命令行生成:
pipenv install django=2.0.6
pipenv install requests
这样也会安装依赖包并生成Pipfile.lock文件
- 查看pipfile.lock文件,可以看到安装的所有包的版本、依赖关系等等
{
"_meta": {
"hash": {
"sha256": "5f0257fe8c7a73db1c8de519faa92c658282a01087eb2bfafba7962704c23e27"
},
"host-environment-markers": {
"implementation_name": "cpython",
"implementation_version": "3.6.4",
"os_name": "nt",
"platform_machine": "AMD64",
"platform_python_implementation": "CPython",
"platform_release": "7",
"platform_system": "Windows",
"platform_version": "6.1.7601",
"python_full_version": "3.6.4",
"python_version": "3.6",
"sys_platform": "win32"
},
"pipfile-spec": 6,
"requires": {},
"sources": [
{
"name": "pypi",
"url": "https://pypi.python.org/simple",
"verify_ssl": true
}
]
},
"default": {},
"develop": {}
}
- 运行项目
pipenv run python xxx.py
pipenv命令详解
pipenv命令具有以下选项
$ pipenv
Usage: pipenv [OPTIONS] COMMAND [ARGS]...
Options:
--update 更新Pipenv & pip
--where 显示项目文件所在路径
--venv 显示虚拟环境实际文件所在路径
--py 显示虚拟环境Python解释器所在路径
--envs 显示虚拟环境的选项变量
--rm 删除虚拟环境
--bare 最小化输出
--completion 完整输出
--man 显示帮助页面
--three / --two 使用Python 3/2创建虚拟环境(注意本机已安装的Python版本)
--python TEXT 指定某个Python版本作为虚拟环境的安装源
--site-packages 附带安装原Python解释器中的第三方库
--jumbotron 不知道啥玩意....
--version 版本信息
-h, --help 帮助信息
可使用的命令参数:
Commands:
check 检查安全漏洞
graph 显示当前依赖关系图信息
install 安装虚拟环境或者第三方库
lock 锁定并生成Pipfile.lock文件
open 在编辑器中查看一个库
run 在虚拟环境中运行命令
shell 进入虚拟环境
uninstall 卸载一个库
update 卸载当前所有的包,并安装它们的最新版本
常用命令如下:
- pipenv --python 3.7 创建3.7版本Python环境
- pipenv install package_name 安装包
- pipenv graph 查看包与包之间依赖关系
- pipenv --venv 查看虚拟环境保存路径
- pipenv --py 查看python解释器路径
- pipenv install package_name --skip-lock 跳过lock,可以等项目开发好后,再更新所有报的hash值
- pipenv install --dev package_name 在开发环境安装测试包(可以加--skip-lock参数)
- pipenv uninstall package_name 卸载包
- 你也可以指定 $ pipenv install -r path/to/requirements.txt 导入某个requirements文件
pipfile文件详解
- [[source]]可以指定pypi库的源,这里可以指定多个源,让不同的包从不同的源里面下载:
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[[source]]
url = "http://pypi.home.kennethreitz.org/simple"
verify_ssl = false
name = "home"
[dev-packages]
[packages]
requests = {version="*", index="home"}
maya = {version="*", index="pypi"}
records = "*"
这样就可以指定requests包从home源下载,maya包从pypi源下载
- [requires] python_version = "3.6" 的加入说明你的应用需要这个版本的Python,以后在运行 pipenv install 时会自动使用这个 Pipfile (比如在另一台机器上)。如果你没有在命令行中指定Python的版本,那么会自动选择 [requires] 中的
python_full_version或 python_version 。执行时候回退到当前系统的默认Python版本。 - [scripts] 添加自定义的脚本命令,并通过 pipenv run 的方式在虚拟环境中执行对应的命令:
[scripts]
test = "python3 -m unittest discover -s ./tests"
dev = "python3 manage.py runserver 0.0.0.0:8000"
然后执行 pipenv run test 就相当于执行了 pipenv run python3 -m unittest discover -s ./tests,pipenv run dev 相当于 pipenv run python3 manage.py runserver 0.0.0.0:8000。非常方便的功能
最佳实践推荐
- 通常情况下,把Pipfile和Pipfile.lock都替换版本控制。
- 当需要兼容多个Python版本时,不要把Pipfile.lock替换版本控制。
- 在Pipfile的[requires]部分中指定目标Python版本。 理想情况下,您应该只有一个目标Python版本,因为这是一个部署工具。 python_version的格式应为X.Y,而python_full_version的格式应为X.Y.Z。
- pipenv install语法与pip install完全兼容,完整文档可见此处。
- 直接用pipenv run python来执行命令,必须在pipfile文件所在路径的目录下执行,例如在根目录下生成的pipfile文件,执行命令为pipenv run python xxx.py或pipenv run python <xxx_path>/xxx.py
- 由于直接用pipenv run来执行会有根目录的限制,所以推荐项目容器化部署,在docker容器里面,把生成的pipfile和pipfile.lock文件导出为requirements再于dockerFile执行安装,这样便可以灵活指定Workdir了,方便cd到项目下任意路径执行python运行命令。