[Python]使用pipenv管理python虚拟环境

作者: admin 分类: Python 发布时间: 2019-04-17 02:39

前言

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

Pipenv是Kenneth Reitz在2017年1月发布的Python依赖管理工具,现在由PyPA维护。你可以把它看做是pip和virtualenv的组合体,而它基于的Pipfile则用来替代旧的依赖记录方式(requirements.txt)。

安装

我们通过pip即可快速安装

pip install pipenv #  安装 pipenv
# 或者
brew install pipenv # mac安装

pipenv 的使用

前提:假设我们在用户目录 ~ 下有一个项目叫 my_project/
我们首先进入项目目录:

cd  ~/my_project

进入项目以后,如果直接执行 pipenv installpipenv 会根据系统默认的python版本,来创建虚拟环境。(前提是本项目中不存在已有的Pipfile,如果有,它会去根据Pipfile安装对应的版本和Pipfile中记录的依赖库)。

但是我们一般会创建虚拟环境的时候指定python版本,就需要配上 --two或者--three 这个参数:
– –two 使用python2来创建虚拟环境
– –three 使用python3来创建虚拟环境

pipenv install --three  # 需要确保系统中存在python3版本

下面是执行后的输出信息:

Creating a virtualenv for this project…
Using /usr/local/bin/python3 to create virtualenv…
# 这里可以看到继承自哪个python版本
⠋Running virtualenv with interpreter /usr/local/bin/python3 Using base prefix '/usr/local'
New python executable in /root/.local/share/virtualenvs/my_project-dhpIKgdN/bin/python3  
Also creating executable in /root/.local/share/virtualenvs/my_project-dhpIKgdN/bin/python
Installing setuptools, pip, wheel...done.

# 这里可以看到虚拟环境安装的位置
Virtualenv location: /root/.local/share/virtualenvs/my_project-dhpIKgdN
Creating a Pipfile for this project…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (625834)!
Installing dependencies from Pipfile.lock (625834)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run the following:
 $ pipenv shell # 要激活该虚拟环境,执行这条指令

这将在项目目录中创建两个新文件 PipfilePipfile.lock

Pipfile 存放着当前虚拟环境的配置信息,包含python版本,pypi源,以及项目安装的依赖库。

  • pipenv根据这个来寻找项目的根目录。
  • Pipfile 文件是 TOML 格式而不是 requirements.txt 那样的纯文本。
  • 一个项目对应一个 Pipfile,支持开发环境与正式环境区分。默认提供 default 和 development 区分
  • Pipfile.lock 顾名思义,这个文件时对于Pipfile的一个锁定。支持锁定项目不同的版本所依赖的环境.

更新 pypi源来提高依赖库安装的速度

在使用pipenv的时候,常常会在安装的时候,一直卡在了 Locking 这里,通过加上 -v 参数,可以看到安装过程中的步骤信息,卡在了下载那里,这时应该可以意识到是因为网络的原因,pipenv创建的 Pipfile 中默认的pypi源是python官方的 https://pypi.python.org/simple。我们国内用户访问下载的时候会很慢。

所以,我一般会在创建好Pipfile以后,修改到文件中 source 块下的 url 字段,设置为国内的 pypi 源就好了,我推荐的是清华的pypi源,具体设置如下:

备注:我还没有找到如何修改能在创建时就设好的方法,应该修改源码是可以的,但这样不尊重源码,毕竟高墙是我们自己筑起的,如果有好的方法,您不妨在评论中告诉我一下

[[source]]

 url = "https://pypi.tuna.tsinghua.edu.cn/simple"
 verify_ssl = true
 name = "pypi"

管理Python依赖关系

Pipfile 包含关于项目的依赖包的信息,并取代通常在Python项目中使用的 requirements.txt 文件。 如果你之前的项目中存在requirements.txt文件,pipenv 可以很轻松的安装 requirements.txt 中的依赖包。

pipenv install -r requirements.txt
# 或者
pipenv install --requirements requirements.txt

可以通过更新 Pipfile.lock 来冻结软件包名称及其版本以及其自己的依赖关系的列表。 这时需要使用lock关键字来完成,

pipenv lock

如果我们想要在虚拟环境中安装某个指定的库,比如 requests, 直接在 install后面跟上就可以了:

pipenv install requests

如果想查看当前环境中第三方包之间的依赖关系,可以通过 pipenv graph 来查看:

[root@VM_27_243_centos my_project]# pipenv graph
requests==2.18.4
  - certifi [required: >=2017.4.17, installed: 2018.1.18]
  - chardet [required: <3.1.0,>=3.0.2, installed: 3.0.4]
  - idna [required: <2.7,>=2.5, installed: 2.6]
  - urllib3 [required: <1.23,>=1.21.1, installed: 1.22]

从输出可以看出,我们按照的 requests包,依赖于其他的四个包,pipenv 帮你自动管理着这些包这件的依赖关系、。我们可以看到 requests 依赖于urllib3, 假设我们再安装一个包,并且这个包也同样依赖着 urllib3 ,当我们要卸载掉 requests 的时候,pipenv会自动检测这些包之间的依赖关系,因为 urllib3 依旧有其他包依赖,所以会保留,只会卸载掉其他的依赖库。(卸载的指令是pipenv uninstall

退出虚拟环境

任何时候想退出虚拟环境,只需一条简单的 exit 指令即可

exit

参考文章

[Python]使用pipenv管理python虚拟环境
Pipenv: Python Dev Workflow for Humans

发表评论

电子邮件地址不会被公开。 必填项已用*标注