pipenv简介
Pipenv,全称为 Python Development Workflow for Humans,旨在为开发项目自动创建和管理虚拟环境并管理 python 包,简言之,就是virtualenv 和 pip 的集合体,通过创建指定 python 版本的虚拟环境和安装依赖包,提供各个项目隔离的开发环境。
虚拟环境
简单来讲,虚拟环境就是隔离你项目中安装的库的一个环境。想象一下,如果想在自己的电脑做几个不同的项目,而不同的项目需要不同版本的库,都放在相同的环境下可能会带来意想不到的麻烦,很可能会遇到库版本冲突的问题。比如项目A需要numpy1.0,而项目B需要numpy1.15。而pip安装的库只有一个版本,而且是全局的。在虚拟环境下安装的库都会被隔离在该环境中,不会与其他环境冲突。通常,我们为每个项目都创建一个虚拟环境,以此来隔离我们的工作环境。
安装使用
安装
$ pip install pipenv #安装
$ pipenv –version #输出版本信息
$ pipenv --help #查看pipenv用法
创建虚拟环境
先cd到目标目录下
$ pipenv install #创建虚拟环境,会使用本地默认版本的py
//制定py版本可以
$ pipenv --python 3.6 #指定使用Python3.6的虚拟环境
$ pipenv --two #使用系统的Python2在创建虚拟环境
$ pipenv --three #使用系统的Python3在创建虚拟环境
执行命令之后,文件夹会生成两个文件,pipfile和pipfile.lock。
如果命令执行前项目目录中不存在 Pipfile 文件,该命令将会创建一个 Pipfile 文件。如果已经有Pipfile 文件已经存在,则会根据这个Pipfile生成虚拟环境。
$ pipenv install --ignore-pipfile //在生产环境中只需要代码和Pipfile.lock,就可以创建和开发环境一样的环境
$ pipenv install --dev //另一个开发环境做开发,则将代码和Pipfile复制过去
由于Pipfile里面没有所有子依赖包或者确定的版本,因此pipnev install可能会更新未指定模块的版本号。
假如该命令更新了一些依赖包的版本,由于我肯定还会在新环境做单元测试或者功能测试,因此我可以确保这些包的版本更新是不会影响软件功能的;然后我会pipenv lock并把它发布到生产环境,因此我可以确定生产环境也是不会有问题的。
安装python包
# 安装命令
pipenv install beautifulsoup4 #在项目所在虚拟环境中安装beautifulsoup4
pipenv install parsel==1.3.1 #安装parsel并指定其版本
pipenv install --dev nose2 #安装nose2包并将其关联为只在开发环境中需要的包
# 卸载命令
pipenv uninstall beautifulsoup4 #在项目所在虚拟环境中卸载beautifulsoup4
pipenv uninstall --all #从虚拟环境中移除所有已安装的包,但Pipfile.lock文件不受影响
pipenv uninstall --all--dev #从虚拟环境中卸载所有开发包,并从Pipfile文件中移除这些包
# 更新命令
pipenv update requests #在项目中更新requests包
pipenv update #更新项目中所有的包
pipenv update --outdated #查看现有包哪些已经过期
#查看命令
pipenv grash #显示现有的依赖包
pipenv lock #更新Pipfile.lock文件锁定当前环境的依赖版本
无论是生产环境还是开发环境的包都会写入一个Pipfile里面。
接下来如果在开发环境已经完成开发,如何构建生产环境的东东呢?这时候就要使用Pipfile.lock了,运行以下命令,把当前环境的模块lock住, 它会更新Pipfile.lock文件,该文件是用于生产环境的,你永远不应该编辑它。
进入虚拟环境
$ pipenv shell //进入虚拟环境
$ exit //退出虚拟环境
$ pipenv run 命令 //在不进入虚拟环境的情况下使用虚拟环境运行代码
pipfile和pipfile.lock文件分析
pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
django = "==2.2.3"
markdown = "*"
[requires]
python_version = "3.6"
source:设置镜像地址,即从哪下载虚拟环境所需要的包
packages:指定项目依赖的包,即你安装了的包
dev-packages:指定开发环境需要的包,这类包只用于开发过程,不用与生产环境,比如单元测试相关的包,只在开发阶段有用,这样分开便于管理。
requires:中指定目标Python版本
pipfile.lock
{
"_meta": {
"hash": {
"sha256": "cd71ab6b94ffbcbc30cf1354920845e3f2bfde04169acdafbfe573b5262ae4c6"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.6"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"django": {
"hashes": [
"sha256:4d23f61b26892bac785f07401bc38cbf8fa4cec993f400e9cd9ddf28fd51c0ea",
"sha256:6e974d4b57e3b29e4882b244d40171d6a75202ab8d2402b8e8adbd182e25cf0c"
],
"index": "pypi",
"version": "==2.2.3"
},
"markdown": {
"hashes": [
"sha256:5ad7180c3ec16422a764568ad6409ec82460c40d1631591fa53d597033cc98bf",
"sha256:9c71241ec237505535eabff7a38b1307250f16cea174bb1e505c3e032f108867"
],
"index": "pypi",
"version": "==3.2"
},
"pytz": {
"hashes": [
"sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d",
"sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"
],
"version": "==2019.3"
},
"sqlparse": {
"hashes": [
"sha256:40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177",
"sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873"
],
"version": "==0.3.0"
}
},
"develop": {}
}
lock包含了所有依赖包的确定版本,保证了生产环境的完整性和稳定性。一般自动生成,不应手动修改。
pipenv优势
1、它可很方便的管理包依赖关系。卸载的时候,可以自动检查依赖库是否被其他包依赖,来选择是否彻底删除。也可以通过 pipenv graph 来查看各个包的依赖关系图。
2、支持Python2 和 Python3,在各个平台的命令都是一样的。
3、集成了pip,virtualenv两者的功能,且完善了两者的一些缺陷。
4、各个地方使用了哈希校验,无论安装还是卸载包都十分安全,且会自动公开安全漏洞。
对比virtualenv:
pipenv 在易用性上要简单很多,同时增加了 lock 文件,能更好的锁定版本。如果没有特殊要求可以 pipenv 直接使用 lock 的版本,开发又可以小步迭代,实现依赖的稳步升级。同时,还有一个是之前用 requirements.txt 的时候通常还需要一个额外的开发 requirements.txt ,这个在 pipenv 里也合并成了单个文件。
本人遇到的坑
我在本地开发好了之后,将项目部署到云服务器上(阿里云的UBUNTU16.04)。
先将pipfile.lock和代码拉到云上,在创建虚拟环境时,pipenv install --ignore-pipfile 命令报错,提示无"zlib"模组,排查之后,发现是因为在创建环境的时候没有指定py版本,ubuntu系统本来自带py2.7,但是这里需要用py3.6,py3.6里有内置"zlib"模组。如果用其他没有内置zlib的python版本,需要下载zlib之后再重新编译python。
指定py版本又遇到了pip的报错,需要检查pip是不是安装在py3.6下,我是因为有py3.5的环境,pip在py3.5下,所以报错。重新安装了pip到python3.6的site-packages下,
并且添加环境变量,就可以解决了。
部分参考链接:
https://blog.csdn.net/Hanniel/article/details/94199734
https://www.jianshu.com/p/d08a4aa0008e
https://www.jianshu.com/p/49a34f25acee