什么是Pipenv

Pipenv是python官方推荐的虚拟环境管理工具,可以把它当作是virtualenv,pip,pyenv三者的集合工具,类似于npm和composer。
它能够自动为项目创建和管理虚拟环境,从 Pipfile 文件中添加或者删除包,同时生成 Pipfile.lock 文件来锁定安装包的版本和依赖信息,避免构建错误。

pipenv 主要解决了以下问题:

  • 不用再单独使用 virtualenv、pyenv 和 pip 了,现在它们结合到了一起。
  • 不用再维护 requirement.txt 了,使用 Pipfile 和 Pipfile.lock 来代替。
  • 可以在开发环境使用多个 python 版本。
  • 在安装的 pyenv 条件下,可以自动安装需要的 python 版本。
  • 安全,广泛地使用 Hash 校验,能够自动曝露安全漏洞。
  • 随时查看图形化的依赖关系。
  • 可通过自动加载 .env 读取环境变量,简化开发流程。

安装 pipenv

MacOS下使用pip安装

$ pip install --user pipenv

这个命令在用户级别(非系统全局)下安装 pipenv。如果安装后 shell 提示找不到 pipenv 命令,你需要添加当前 Python 用户主目录的 bin 目录到 PATH 环境变量。如果你不知道 Python 用户主目录在哪里,用下面的命令来查看:

$ python -m site --user-base

输出如下

MacOS下使用brew安装

$ brew install pipenv

Pipenv常用命令

命令

$ pipenv
Usage: pipenv [OPTIONS] COMMAND [ARGS]...

Options:
  --where          显示项目文件所在路径
  --venv           显示虚拟环境实际文件所在路径
  --py             显示虚拟环境Python解释器所在路径
  --envs           显示虚拟环境的选项变量
  --rm             删除虚拟环境
  --bare           最小化输出
  --completion     完整输出
  --man            显示帮助页面
  --three / --two  使用Python 3/2创建虚拟环境(注意本机已安装的Python版本)
  --python TEXT    指定某个Python版本作为虚拟环境的安装源
  --site-packages  附带安装原Python解释器中的第三方库
  --jumbotron      An easter egg, effectively.
  --version        版本信息
  -h, --help       帮助信息

命令参数

Commands:
  check      检查安全漏洞
  graph      显示当前依赖关系图信息
  install    安装虚拟环境或者第三方库
  lock       锁定并生成Pipfile.lock文件
  open       在编辑器中查看一个库
  run        在虚拟环境中运行命令
  shell      进入虚拟环境
  uninstall  卸载一个库
  update     卸载当前所有的包,并安装它们的最新版本

pipenv 使用

创建环境,安装指定版本的python

首先需要看一下当前目录是否已经创建了虚拟环境,使用如下命令

$ pipenv -venv

结果如下

这说明当前的项目没有创建虚拟环境,可以使用Pipenv 来创建一个虚拟环境:

$ pipenv –three

如果指定了 --two 或者 --three 选项参数,则会使用 python2 或者 python3 的版本安装,否则将使用默认的 python 版本来安装。当然也可以指定准确的版本信息:

$ pipenv install --python 3
$ pipenv install --python 3.8
$ pipenv install --python 2.7.14

pipenv 会自动扫描系统寻找合适的版本信息,如果找不到的话,同时又安装了 pyenv 的话,则会自动调用 pyenv 下载对应版本的 python, 否则会报错。

这时候在当前项目根目录下会生成 Pipfile 和 Pipfile.lock 两个环境初始化文件

进入|退出环境

进入环境
pipenv shell
退出环境
exit

安装第三方包

测试安装 selenium 包

pipenv install selenium

此时,Pipfile 里有最新安装的包文件的信息,如名称、版本等。用来在重新安装项目依赖或与他人共享项目时,你可以用 Pipfile 来跟踪项目依赖。

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

$ cat Pipfile[[source]]name = "pypi"url = "https://pypi.tuna.tsinghua.edu.cn/simple/"verify_ssl = true[packages]urllib3 = "*"selenium = "*"[dev-packages][requires]python_version = "3.8"

Pipfile.lock 则包含你的系统信息,所有已安装包的依赖包及其版本信息,以及所有安装包及其依赖包的 Hash 校验信息。

$ Pipfile.lock{    "_meta": {        "hash": {            "sha256": "b02856f549692af24a14f79bfe022df973a9ea09ddfb4cbf7c7ecab5248ac322"        },        "pipfile-spec": 6,        "requires": {            "python_version": "3.8"        },        "sources": [            {                "name": "pypi",                "url": "https://pypi.tuna.tsinghua.edu.cn/simple/",                "verify_ssl": true            }        ]    },    "default": {        "selenium": {            "hashes": [                "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c",                "sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d"            ],            "index": "pypi",            "version": "==3.141.0"        },        "urllib3": {            "hashes": [                "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df",                "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"            ],            "index": "pypi",            "version": "==1.26.4"        }    },    "develop": {}}

那么Pipfile 和 Pipfile.lock 有什么用呢?
Pipfile 其实一个 TOML 格式的文件,标识了该项目依赖包的基本信息,还区分了生产环境和开发环境的包标识,作用上类似 requirements.txt 文件,但是功能更为强大。
Pipfile.lock 详细标识了该项目的安装的包的精确版本信息、最新可用版本信息和当前库文件的 hash 值,顾明思义,它起了版本锁的作用。
可以注意到当前 Pipfile.lock 文件中的 Selenium 版本标识为 ==3.141.0,意思是当前我们开发时使用的就是 3.141.0版本,它可以起到版本锁定的功能。

举个例子,刚才我们安装了 Selenium 3.141.0 的版本,即目前(2021.5.22)的最新版本。但可能 Selenium 以后还会有更新,比如某一天 Selenium 更新到了 3.2 版本,这时如果我们想要重新部署本项目到另一台机器上,假如此时不存在 Pipfile.lock 文件,只存在 Pipfile文件,由于 Pipfile 文件中标识的 Selenium 依赖为 selenium= “*”,即没有版本限制,它会默认安装最新版本的 Selenium,即 3.2,但由于 Pipfile.lock 文件的存在,它会根据 Pipfile.lock 来安装,还是会安装 Selenium 3.141.0,这样就会避免一些库版本更新导致不兼容的问题。

安装指定版本包

pipenv install selenium==3.141.0

安装开发环境下的包

通常有一些Python包只在你的开发环境中需要,而不是在生产环境中,例如单元测试包。 加 --dev 表示包括 Pipfile 的 dev-packages 中的依赖。

pipenv install unittest --dev

django库现在将只在开发虚拟环境中使用。如果你要在你的生产环境中安装你的项目:

pipenv install

这不会安装unittest包。
但是,如果有一个开发人员将你的项目克隆到自己的开发环境中,他们可以使用–dev标志,将django也安装:

pipenv install –dev

也就是说一个–dev参数,帮你在同一个虚拟环境中又区分出了开发和非开发环境

卸载第三方包

pipenv uninstall selenium //或者 pipenv uninstall --all

更新安装包

pipenv update selenium pipenv update # 更新所有安装包

查看虚拟环境目录

$ pipenv --venv

查看项目根目录

$ pipenv --where

检查软件包的完整性

$ pipenv check

生成Pipfile.lock

有时候可能 Pipfile.lock 文件不存在或被删除了,可以使用如下命令生成:
$ pipenv lock

修改Pipenv下载源

在使用pipenv install安装的过程中如果下载比较慢可以在pipfile文件中指定下载源:

[[source]]name = "pypi"url = "https://pypi.tuna.tsinghua.edu.cn/simple/"verify_ssl = true[packages]urllib3 = "*"selenium = "*"[dev-packages][requires]python_version = "3.8"

Pip下载源

查看依赖树

$ pipenv graph

锁定版本

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

$ pipenv lock

参考链接

Pipenv – 超好用的 Python 包管理工具
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解

内容来源于网络如有侵权请私信删除