一起使用 pipenv

今天十里给大家推荐一个 python 工具,它就是 python 官方推荐的包管理工具 pipenv。这个工具会十八般武艺, virtualenv、pyenv 和 pip 三者的功能集于一身,可谓是高手中的高手了,所以,掌控了它相信你会轻松很多!

20181018153983543930207.png

身世与技能

不知道大家晓不晓得 python 界很有名的励志型男 Kenneth Reitz,如果你不知道他的话,那你一定知道 requests 库吧,没错,requests 库的作者就是 Kenneth Reitz,是他开发了用于创建和管理 python 虚拟环境的工具 pipenv。

pipenv 能够自动为项目创建和管理虚拟环境,从 Pipfile 文件中添加或者删除包,同时生成 Pipfile.lock 文件来锁定安装包的版本和依赖信息,避免构建错误。它解决了以下问题^[Pipenv – 超好用的 Python 包管理工具]:

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

安装及配置

安装

这里推荐使用 pip 安装:

$ pip install pipenv

配置

我们知道有些 python 工具命令行下默认不支持补全,pipenv 也不例外,如果将下面的内容添加到 .bashrc.zshrc 中就可以实现 pipenv 命令的补全了:

eval "$(pipenv --completion)"

使用

本节以一个工程为例展示操作流程,从而说明 pipenv 的使用。

创建虚拟环境

  1. 新建工程

    $ mkdir myproject
    $ cd myproject
    
  2. 执行以下命令创建虚拟环境:

    $ pipenv install
    

    执行完上面的命令,就会发现目录下出现 PipfilePipfile.lock 两个文件,它们主要记录包的安装信息,上面的命令会使用系统默认版本的 python 创建虚拟环境,如果要使用其他版本可以指定 --two--three 参数指定使用 2.x 版本还是 3.x 版本,形如:

    $ pipenv install --three
    

    也可以直接指定详细版本号,比如:

    # pipenv install --python 3
    # pipenv install --python 2.7.15
    $ pipenv install --python 3.7
    

第三方包管理

安装包

可以使用 pipenv install 包名 安装第三方包,比如这里安装 requests:

$ pipenv install requests

安装过程中,Pipfile 会记录包安装的信息和使用的安装源,名称、版本号等。所以 Pipfile 可以跟踪包的管理信息,可以在与别人分享项目的时候,实现一致的开发环境。而 Pipfile.lock 中包含系统信息,所有已安装包的依赖包及其版本信息,以及所有安装包及其依赖包的 Hash 校验信息。

指定版本安装

这里以安装版本为1.22的 urllib3 为例:

pipenv install urllib3==1.22
安装开发版本包

在安装命令的基础上使用 --dev 参数即可:

pipenv install httpie --dev

至此,我们可以查看一下 Pipfile 的内容,看看有没有同步记录包的安装信息:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = "*"
"urllib3" = "==1.22"

[dev-packages]
httpie = "*"

[requires]
python_version = "3.7"

可以看到开发版本的包信息在 [dev-packages] 节点记录,而正常的包在 [packages] 节点记录,同时也能看到 urllib3 确实是 1.22 版本的。

包同步

有了 Pipfile.lock 就可以在一个新的目录下搭建一致的 python 开发环境了,使用 pipenv syns 命令就会读取 Pipfile.lock 包信息进行第三方包的批量安装了。

更改安装源

有时安装包时比较慢,为了快速一点可以更改为国内的包安装源,更改 pipfile 中的 source 配置即可,主要是 url ,比如更改为阿里源,可以为:

[[source]]
url = "https://mirrors.aliyun.com/pypi/simple"
verify_ssl = true
name = "aliyun"

卸载包

可以使用 pipenv uninstall 命令卸载第三方包,比如要卸载刚刚安装的 httpie

$ pipenv uninstall httpie

此时看一下 Pipfile 内容,可以看到已经没有了 httpie 的记录信息了:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = "*"
"urllib3" = "==1.22"

[dev-packages]

[requires]
python_version = "3.7"

如果想把所有的包都卸载,可以使用以下命令:

pipenv uninstall --all

另外,可以使用 clean 命令清除 Pipfile.lock 中没有记录的包:

$ pipenv clean

更新包

更新一个具体的包很简单,比如要更新 urllib3 ,可以执行如下命令:

$ pipenv update urllib3

如果想更新所有的包,可以这样:

$ pipenv update

查看包安装信息

可以通过以下命令清晰有层次的查看包的安装依赖信息:

$ pipenv graph
Pygments==2.2.0
requests==2.19.1
  - certifi [required: >=2017.4.17, installed: 2018.10.15]
  - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
  - idna [required: >=2.5,<2.8, installed: 2.7]
  - urllib3 [required: >=1.21.1,<1.24, installed: 1.22]

检查包完整性

有些时候需要检查一下包的完整性,据说可以依据 PEP 508 检查安全漏洞,感觉很高端的样子:

$ pipenv check
Checking PEP 508 requirements...
Passed!
Checking installed package safety...
All good!

其它操作

使用虚拟环境中的 python

比如,目录中有个文件 demo.py ,如果想使用虚拟环境中的 python 运行这个文件怎么办?可以使用 pipenv run 比如这样:

$ pipenv run python demo.py

也可以这样执行 pip 命令:

$ pipenv run pip list

进入或退出虚拟环境

执行命令 pipenv shell 便可进入虚拟环境,在环境中使用的 python 就是虚拟环境中的:

$ pipenv shell
Launching subshell in virtual environment…
. /Users/5km/.local/share/virtualenvs/myproject-NwwHp4QU/bin/activate
$ . /Users/5km/.local/share/virtualenvs/myproject-NwwHp4QU/bin/activate
(myproject-NwwHp4QU) $

在虚执环境中执行命令 exit 或者使用快捷键 CTRL + d 便可退出虚拟环境。

查看虚拟环境安装目录

$ pipenv --venv
/Users/5km/.local/share/virtualenvs/myproject-NwwHp4QU

查看工程根目录

有时需要查看当前使用的虚拟环境对应的工程根目录,使用命令 pipenv --where 即可查看:

$ pipenv --where
/Users/5km/Desktop/myproject

环境变量

在虚拟开发环境中,操作都是独立的,并不影响系统的环境,这是虚拟环境的最重要作用,有时候也需要独立的虚拟环境变量,而不是存在于系统的环境变量中。只需要在工程根目录新建一个 .env 文件,在文件中声明环境变量即可,比如想添加一个变量 FLASK_KEY 值为 NONE,可以将 FLASK_KEY=NONE 放到 .env 中:

echo "FLASK_KEY=NONE" > .env

重新进入虚拟环境后,就会自动加载 .env 中的环境变量,此时就可以使用环境变量了:

$ pipenv shell
Launching subshell in virtual environment…
 . /Users/5km/.local/share/virtualenvs/myproject-NwwHp4QU/bin/activate
$ . /Users/5km/.local/share/virtualenvs/myproject-NwwHp4QU/bin/activate
(myproject-NwwHp4QU) $ echo $FLASK_KEY
NONE

注意:

在虚拟环境中,使用 pip 安装第三包是安装在虚拟环境中的,但是不会记录到 Pipfile 中,虚拟环境中也可以使用 pipenv install 安装第三方包,此时仍会记录在 PipfilePipfile.lock 中。

问题

‘module’ object is not callable 问题

使用命令 pipenv install 安装软件包的时候,可能会遇到 TypeError: ‘module’ object is not callable 问题,这是因为 pip 版本不兼容的问题导致的,可以在相应的工程内执行以下命令安装 18.0 版本的 pip 临时解决^[Running pipenv gives TypeError: ‘module’ object is not callable #2871]:

$ pipenv run pip install pip==18.0

这个问题,是在本文章发表的时候刚出现的,可能会随着 pipenv 的升级得到相应解决。

ValueError: unknown locale: UTF-8 问题

这个问题解决方法很简单,只需指定环境变量即可,可以将以下内容添加到 .bashrc.zshrc 中解决^[ValueError: unknown locale: UTF-8 #187]:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

Lock updating 很慢的问题

在使用 pipenv install 安装包最后,会进行一次 lock 操作,但是 lock 操作奇慢无比, 果不想等待漫长(或者是永久)的时间,可以在每次安装包操作的时候添加参数 --skip-lock 进行跳过^[Lock updating is very slow #1914],形如:

$ pipenv install requests --skip-lock

总结

本文简单介绍了 pipenv 的安装和使用方法,希望您读了本文能感受到这个工具的方便之处!


python

2311 字

2018-10-18 10:53 +0800