Pipenv:新一代Python项目环境与依赖管理工具

什么是Pipenv

Pipenv是Kenneth Reitz在2017年1月发布的Python依赖管理工具,如今由PyPA维护。你能够把它看作是pip和virtualenv的组合体,而它基于的 Pipfile则用来替代旧的依赖记录方式(requirements.txt)。
在这篇文章里,我将会以旧的依赖管理工做流程做为对比来介绍Pipenv的基本用法,更详细的用法能够参考 Pipenv文档,或是Kenneth Reitz在PyCon 2018的演讲 《Pipenv: The Future of Python Dependency Management》
顺便说一句,个人还没上市的 《Flask Web开发实战》中全部示例程序都使用了Pipenv进行依赖管理。
提示 若是你对virtualenv的用法以及虚拟环境的概念不熟悉的话,能够经过专栏的旧文 《Flask出发之旅》进行简单的认识。

为何使用Pipenv

Pipenv会自动帮你管理虚拟环境和依赖文件,而且提供了一系列命令和选项来帮助你实现各类依赖和环境管理相关的操做。简而言之,它更方便、完善和安全。你能够经过 Pipenv文档开头的介绍来了解它的详细特性。Pipenv的slogan是“Python Dev Workflow for Humans”,做为人类,固然应该尝试一下……

如何使用Pipenv

假设咱们要编写一个博客程序,项目的依赖是Flask和Flask-WTF。顺便说一句,可使用下面的命令安装Pipenv:
$ pip install pipenv复制代码
下面我会经过不一样操做来给出所需命令的对比,OLD(旧)表示使用pip和virtualenv,NEW(新)表示使用Pipenv。

建立虚拟环境
  • OLD
$ virtualenv venv 复制代码
提示 这里的venv是虚拟环境目录的名称,你能够自由更改,这会在你的项目根目录建立一个venv文件夹,其中包含独立的Python解释器环境。
  • NEW
$ pipenv install复制代码
Pipenv会自动为你建立虚拟环境,自动生成一个随机的虚拟环境目录名。

激活虚拟环境
  • OLD
在Linux或macOS系统中:
$ . venv/bin/activate复制代码
Windows:
> venv\Scripts\activate复制代码
  • NEW
$ pipenv shell复制代码
此外,Pipenv还提供了一个pipenv run命令,在该命令后附加的参数会直接做为命令在虚拟环境中执行,这容许你没必要显式的激活虚拟环境便可在虚拟环境中执行命令。好比,pipenv run python会启动虚拟环境中的Python解释器。

安装依赖到虚拟环境
  • OLD
$ . venv/bin/activate  # 须要先激活虚拟环境
(venv)$ pip install flask flask-wtf  复制代码
  • NEW
使用Pipenv,无论你是否激活了虚拟环境,均可以经过pipenv install命令安装:
$ pipenv install flask flask-wtf  复制代码
事实上,对一个新项目来讲,你没必要手动使用pipenv install来建立虚拟环境。当使用pipenv install xxx直接安装依赖包时,若是当前目录不包含虚拟环境,Pipenv会自动建立一个。

记录依赖
  • OLD
(venv)$ pip freeze > requirements.txt复制代码
这个命令会把依赖列表写入requirements.txt文件。每当你安装或卸载了依赖包时,都须要手动更新这个文件。你必须保持谨慎,不然很是容易把依赖列表弄乱。
  • NEW
使用Pipenv时,什么都没必要作,Pipenv会自动帮你管理依赖。Pipenv会在你建立虚拟环境时自动建立Pipfile和Pipfile.lock文件(若是不存在),而且会在你使用pipenv install和pipenv uninstall命令安装和卸载包时自动更新Pipfile和Pipfile.lock。
附注 Pipfile用来记录项目依赖包列表,而Pipfile.lock记录了固定版本的详细依赖包列表。

在部署环境安装依赖
  • OLD
当咱们须要在一个新的环境,好比部署上线环境安装全部依赖时,咱们须要重复上面的多条命令:
$ virtualenv venv  # 建立虚拟环境
$ . venv/bin/activate  # 激活虚拟环境
(venv)$ pip install -r requirements.txt  # 安装requirement.txt中记录的依赖复制代码
  • NEW
使用Pipenv则只须要执行pipenv install,它会自动安装Pipfile中记录的依赖:
$ pipenv install复制代码

区分开发依赖
  • OLD
使用requirements.txt时,咱们经过会单首创建一个requirements-dev.txt文件来手动加入开发依赖。好比项目开发时才会用到pytest,那么你须要手动建立这个文件,而后写入:
-r requirements.txt
pytest==1.2.3复制代码
在新的开发环境安装依赖时,你须要安装这个文件中的依赖:
(venv)$ pip install -r requirements-dev.txt复制代码
  • NEW
使用Pipenv时,你只须要在安装pytest时添加一个--dev选项,它会自动被分类为开发依赖(写入Pipfile的dev-packages一节中):
$ pipenv install pytest --dev复制代码
在新的开发环境安装依赖时,也只须要在pipenv install命令后添加--dev选项便可一并安装开发依赖:
$ pipenv install --dev复制代码

总结

为了让你更轻松的过渡,Pipenv甚至提供了读取和生成requirements.txt文件的功能(在使用pipenv install命令时它会自动读取requirements.txt文件安装依赖并生成Pipfile文件)。但愿这篇文章可让你更快的上手Pipenv。

Q&A

Q:安装Python包太慢?
A:Pipenv自己就是基于Pip,因此也能够更换PyPI源。只须要在Pipfile中更换对应的url便可。好比,下面的Pipfile使用阿里云提供的镜像源:
[[source]]

url = "https://mirrors.aliyun.com/pypi/simple"
verify_ssl = true
name = "pypi"复制代码

Q:生成Pipfile.lock太慢?
A:不像npm等依赖管理工具(依赖经过纯文本定义),对于Python包,若是你要获取详细的依赖状况,须要下载安装包并执行setup.py文件,因此会耗费必定时间。一般来讲,更换PyPI源已经能够大幅提高速度。若是你仍然不想等待生成Pipfile.lock的时间,那么能够在执行pipenv install命令时添加--skip-lock选项来跳过lock步骤,最后使用pipenv lock命令来统一执行lock操做。

Q:自定义虚拟环境文件夹路径
A:默认状况下,Pipenv会自动为你选择虚拟环境的存储位置,在Windows下一般为C:\Users\Administrator\.virtualenvs\,而Linux或macOS则为~/.local/share/virtualenvs/。若是你想将虚拟环境文件夹在项目目录内建立,能够设置环境变量PIPENV_VENV_IN_PROJECT,这时名为.venv的虚拟环境文件夹将在项目根目录被建立。另外你也能够经过WORKON_HOME环境变量来自定义存储路径。
相关文章
相关标签/搜索