pipenv调研报告

提纲

  • 什么是pipenv
  • 和之前的virtualenv等工具相比解决了什么问题
  • 如何使用pipenv
    • 基础应用
    • 高级应用

什么是pipenv

Pipenv: Python Development Workflow for Humans
现在已成为Python官方推荐的管理软件包依赖关系工具。

pipenv 是 Pipfile 主要倡导者、requests 作者 Kenneth Reitz 写的一个命令行工具,主要包含了Pipfile、pip、click、requests和virtualenv。Pipfile和pipenv本来都是Kenneth Reitz的个人项目,后来贡献给了pypa组织。Pipfile是社区拟定的依赖管理文件,用于替代过于简陋的 requirements.txt 文件

pip 与 virtualenv 与 pipenv

使用pip管理包的问题

pip是Python的包安装管理工具,管理功能非常弱,通常使用requirements.txt保存软件版本信息

pip freeze > requirements.txt将已安装软件包的列表输出到文本文件
pip install -r requirements.txt命令安装所需的应用程序

如果使用了pip install 命令安装软件,需要pip freeze > requirements.txt手动管理文件

requirements.txt里的Python包如果不指定版本,不同时期执行pip install -r requirements.txt安装的软件版本可能不同。

没有指定flask版本的 requirements.txt

  1. $ cat requirements.txt
  2. requests[security]
  3. flask
  4. gunicorn==19.4.5

为什么需要虚拟环境

pip并不能将软件包彼此隔离。用户可能需要使用不同版本的相同库的应用程序,于是我们需要虚拟环境,我们为每个应用程序创建了小型,孤立的环境。我们已经看到许多用于管理虚拟环境的工具:virtualenv,venv,virtualenvwrapper,pyenv,pyenv-virtualenv,pyenv-virtualenvwrapper等等。它们能使用pip和requirements.txt文件进行Python软件的安装。工具甚多,但是功能却都是一样的,而且让人感到混乱。

pipenv解决什么问题

  • 不在需要分别单独使用pip和virtulenv进行管理虚拟环境管理和包管理,pipenv将他们整合在一起了
  • 使用requirements.txt 文件进行包管理可能会有一些问题(见上【使用pip管理包的问题】),所以 Pipenv 使用 Pipfile 和 Pipfile.lock 来完成此依赖性管理。当使用Pipenv安装库时,项目的Pipfile会自动更新
  • 其次,Pipenv可以更容易管理复杂的相互依赖关系。
  • 优化查看包的引用结构图形(e.g. $ pipenv graph)
  • 通过加载.env环境文件来简化开发工作流程

基本上用法非常简单,和通常使用 pip + requirements.txt + virtualenv 这个组合并没有太大区别。但是不用自己操心虚拟环境

Pipenv 的一些特性

  • 自动生成lock文件并且坚持依赖包的哈希值
  • 自动根据Pipfile找到项目的home目录
  • 如果不存在Pipfile文件,会自动生成
  • 自动在标准位置创建虚拟环境
  • 当使用un/install 命令安装包的时候,自动更新Pipfile文件
  • 如果存在.env 文件会自动引入

主要的命令就是 install uninstall lock,其中lock是生成一个Pipfile.lock 文件对软件的依赖进行详细明确的锁定

Pipfile & Pipfile.lock

Pipfile是用来替代原来的requirements.txt的。
内容类似下面这样。source部分用来设置仓库地址,packages部分用来指定项目依赖的包,dev-packages部分用来指定开发环境需要的包,这样分开便于管理。

  1. [[source]]
  2. url = "https://pypi.python.org/simple"
  3. verify_ssl = true
  4. name = "pypi"
  5. [packages]
  6. requests = "*"
  7. parsel = "==1.3.1"
  8. celery = "*"
  9. [dev-packages]
  10. pymysql = "*"

而Pipfile.lock中记录了当前环境中安装的依赖的版本号以及哈希,以保证每次装出来的依赖都是一致的。

安装

  1. pip install pipenv

创建环境

一行命令搞定 virtualenv 和 pipfile 的初始化,它会在你的用户目录下对你的 virtualenv 进行统一管理。如果当前目录下有 requirements.txt 文件,它会非常贴心地帮你自动转换。(随后你就可以把 requirements.txt 扔掉

初始化一个 python3 的环境

  1. pipenv --three

初始化一个 python2 的环境 (Python核心团队计划2020年停止支持Python2)

  1. pipenv --two

初始化特定版本的环境

  1. pipenv --python 3.6

pypy 也是可以的

进入 / 退出环境

进入环境

  1. pipenv shell

退出环境

  1. exit

安装 / 更新 / 卸载依赖

安装项目已有的所有依赖,加—dev表示包括 Pipfile 的 dev-packages 中的依赖。

  1. pipenv install --dev

安装某个包

  1. pipenv install requests

安装指定版本的包,安装时加—dev表示加入到 dev 环境

  1. pipenv install parsel==1.3.1 --dev

从项目中更新某个包

  1. pipenv update requests

或更新所有的包

  1. pipenv update

从项目环境中移除某个包

  1. pipenv uninstall requests

另外,Pipefile 和 Pipefile.lock 都会按照你的操作进行自动的更新,如果需要手动修改包的依赖条件,手工编辑 Pipefile 并进行安装即可。

打印环境中已安装的包

  1. pipenv graph

能够更清晰地展示现有依赖包。

锁定版本,更新 lock 文件锁定当前环境的依赖版本

  1. pipenv lock

pipenv 基础应用

https://docs.pipenv.org/basics/

pipenv 高级应用

https://docs.pipenv.org/advanced/

指定安装包源

  1. [[source]]
  2. url = "https://pypi.python.org/simple"
  3. verify_ssl = true
  4. name = "pypi"
  5. [[source]]
  6. url = "http://pypi.home.kennethreitz.org/simple"
  7. verify_ssl = false
  8. name = "home"
  9. [dev-packages]
  10. [packages]
  11. requests = {version="*", index="home"}
  12. maya = {version="*", index="pypi"}
  13. records = "*"

reference