一起使用 pipenv
今天十里给大家推荐一个 python 工具,它就是 python 官方推荐的包管理工具 pipenv。这个工具会十八般武艺, virtualenv、pyenv 和 pip 三者的功能集于一身,可谓是高手中的高手了,所以,掌控了它相信你会轻松很多!
身世与技能
不知道大家晓不晓得 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 的使用。
创建虚拟环境
-
新建工程
$ mkdir myproject $ cd myproject
-
执行以下命令创建虚拟环境:
$ pipenv install
执行完上面的命令,就会发现目录下出现
Pipfile
和Pipfile.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
安装第三方包,此时仍会记录在 Pipfile
和 Pipfile.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 的安装和使用方法,希望您读了本文能感受到这个工具的方便之处!