简单上手 PIPENV

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值