python 虚拟环境管理 pipenv 使用

pipenv 是 2017 年 1 月由 Kennethreitz 大神创作,目前已经有 286 个版本发布,可见在 GitHub 上是非常活跃的项目。简单来说 pipenv 的是管理 python 环境和 python 依赖包的工具。使用时 pipenv 会自动创建虚拟环境,并且新增了 Pipfile 文件来维护包依赖, 新增 Pipfile.lock 已在确定环境和依赖后锁定项目,以便最终版本发布。 pipenv 还是 Python.org 正式推荐的 python 包管理工具。
引用官方说明:

Pipenv — the officially recommended Python packaging tool from Python.org, free (as in freedom).

pipevn 可以解决那些问题

  1. 使用 pipevn 就相当于同时使用了 pip 和 virtualenv ,即做到包管理又可以管理虚拟环境。

  2. 使用 pipevn 解决 requirement.txt 面临的问题

  3. pipenv 使用 Pipfile 代替 requirement.txt 文件来记录项目依赖包。

  4. 新增了 Pipfile.lock 文件来锁定 python 软件的包名及版本,以及其依赖关系的列表。

  5. 它参考了其他语言的包管理工具(bundler, composer, npm, cargo, yarn, etc.),旨在将最好的包管理工具带入 python 世界。

准备工作

Mac

使用 Homebrew 安装:

1
brew install pipenv

Ubuntu17.10

1
2
3
4
sudo apt install software-properties-common python-software-properties
sudo add-apt-repository ppa:pypa/ppa
sudo apt update
sudo apt install pipenv

使用 pip 安装

作者推荐在 python3 下边安装,会提高与 virtualenv 的兼容性。

1
pip install pipenv

为防止和系统python库产生影响,可使用此种方案安装。

1
pip install --user pipenv

pip 默认安装包路径为 /usr/local/lib/python2.7/site-packages 。此模式下,pip 安装包保存路径为用户库路径,可使用命令 python3 -m site –user-site 具体查看。

1
2
$ python3 -m site --user-site
/Users/apple/Library/Python/3.6/lib/python/site-packages

如果在安装后你的 shell 中 pipenv 不可用,你需要把用户库的二进制目录 /Users/apple/Library/Python/3.6/bin 添加到你的 PATH 中。

基本使用

pipenv 虚拟环境使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# 创建实例项目
$ mkdir PipenvDemo
$ cd PipenvDemo
$ touch helloworld.py

$ vim helloworld.py
print("hello world")

$ python3 helloworld.py
hello world

# 使用 python3 创建 pipenv 虚拟环境
$ pipenv install --three
Creating a Pipfile for this project… # 自动创建 Pipfile
Pipfile.lock not found, creating… # 自动创建 Pipfile.lock
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (ca72e7)!
Installing dependencies from Pipfile.lock (ca72e7)…
🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run the following:
$ pipenv shell

# 查看虚拟环境位置
$ pipenv --venv
/Users/apple/.local/share/virtualenvs/PipenvDemo-jMTXT_BG

# 查看 python 解析器位置
$ pipenv --py
/Users/apple/.local/share/virtualenvs/PipenvDemo-jMTXT_BG/bin/python

# 运行
$ pipenv run python helloworld.py
hello world

# 使用 pipenv 创建的虚拟环境运行
$ pipenv shell
Spawning environment shell (/bin/zsh). Use 'exit' to leave.
. /Users/apple/.local/share/virtualenvs/PipenvDemo-jMTXT_BG/bin/activate

# 查询当前环境 python 的位置
$ which python
/Users/apple/.local/share/virtualenvs/PipenvDemo-jMTXT_BG/bin/python

# 查看当前环境 python 的版本
$ python -V
Python 3.6.5

# 运行 python 程序
python helloworld.py

# 安装依赖包
$ pipenv install requests
Installing requests…
Collecting requests...
Successfully installed certifi-2018.4.16 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22

Adding requests to Pipfile's [packages]…
Pipfile.lock (ca72e7) out of date, updating to (b14837)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (b14837)!...

# 查看安装包依赖
$ pipenv graph
requests==2.18.4
- certifi [required: >=2017.4.17, installed: 2018.4.16]
- chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
- idna [required: >=2.5,<2.7, installed: 2.6]
- urllib3 [required: <1.23,>=1.21.1, installed: 1.22]

# 依赖包只安装在开发环境
$ pipenv install pytest --dev
Installing pytest...
...
Adding pytest to Pipfile's [dev-packages]...

# 查看 Pipfile 文件,发现 pytest 放到了 dev-packages 下
$ cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = "*"

[dev-packages]
pytest = "*"

[requires]
python_version = "3.6"

通过上面的示例,已经可以掌握大部分使用方法,更多命令详细内容读者可参考:basics

高级使用

命令行自动完成

如果你使用 bash 或者 zsh, 你可以在 ~/.bash_profile (~/.zshrc) 中设置如下变量,使用命令时按 tab 键会自动补全命令,非常方便

1
eval "$(pipenv --completion)"

使用 requirements.txt 来安装包依赖

通过 requirements.txt 安装,重用 requirements.txt 来构建新环境

1
pipenv install -r requirements.txt

自动安装 python

如果你之前使用的是 pyenv 来管理 python 的版本,当使用 pipenv install 的时候 pipenv 会自动检测 python 是否存在,并询问你是否要安装该版本的 python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ cat Pipfile
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[dev-packages]

[packages]
requests = "*"

[requires]
python_version = "3.6"

$ pipenv install
Warning: Python 3.6 was not found on your system…
Would you like us to install latest CPython 3.6 with pyenv? [Y/n]: y
Installing CPython 3.6.2 with pyenv (this may take a few minutes)…
...
Making Python installation global…
Creating a virtualenv for this project…
Using /Users/apple/.pyenv/shims/python3 to create virtualenv…
...
No package provided, installing all dependencies.
...
Installing dependencies from Pipfile.lock…
🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 — 00:00:03
To activate this project's virtualenv, run the following:
$ pipenv shell

修改默认 python 版本

Pipenv 默认使用 python3 来初始化项目,你可以通过 使用 –three 或者 –two 标识来改变初始化环境的 python 版本。也可以指定 PIPENV_DEFAULT_PYTHON_VERSION 值来指定 python 版本。

自动加载 .env 文件

如果在你的项目中包含 .env 文件,使用 $ pipenv shell 和 $ pipenv run 将会自动加载该文件。
如果你的 .env 文件没有在当前目录下,或者不叫 .env ,你可以使用如果命令指定文件位置或名称

1
PIPENV_DOTENV_LOCATION=/path/to/.env pipenv shell

阻止 pipenv 自动加载 .env 文件

1
PIPENV_DONT_LOAD_ENV=1 pipenv shell

更多高级命令及使用详细内容可参考:advanced

结合 vs code 使用

vs code 已经支持 pipenv 的使用,官方说明:

A pipenv environment for the workplace folder. If one is found then no other interpreters are searched for or listed as pipenv expects to manage all aspects of the environment.

大意是:项目如果使用 pipenv 环境,一旦发现使用了 pipenv ,则只列出此项目的 interpreter ,不会在搜索其他的 python 解析器,因为 pipenv 可以管理环境的各个方面。

使用 vs code 作为开发工具,打开已经生成 Pipfile 文件的项目,在选择 python interperter (⇧⌘P) 时,可能会遇到以下错误提示:

1
2
Workspace contains pipfile but attempt to run pipenv --venv failed with Traceback (most recent call last):
File /usr/local/Cellar/pipenv/11.10.3/libexec/bin/pipenv, line 11, in <module> load_entry_point(pipenv==11.10.3, console_scripts, pipenv)() File /usr/local/Cellar/pipenv/11.10.3/libexec/lib/python3.6/site-packages/pipenv/vendor/click/core.py, line 722, in __call__ return self.main(*args, **kwargs) File /usr/local/Cellar/pipenv/11.10.3/libexec/lib/python3.6/site-packages/pipenv/vendor/click/core.py, line 676, in main _verify_python3_env() File /usr/local/Cellar/pipenv/11.10.3/libexec/lib/python3.6/site-packages/pipenv/vendor/click/_unicodefun.py, line 118, in _verify_python3_env for mitigation steps. + extra) RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment. Consult http://click.pocoo.org/python3/for mitigation steps. This system lists a couple of UTF-8 supporting locales that you can pick from. The following suitable locales where discovered: af_ZA.UTF-8, am_ET.UTF-8, be_BY.UTF-8, bg_BG.UTF-8, ca_ES.UTF-8, cs_CZ.UTF-8, da_DK.UTF-8, de_AT.UTF-8, de_CH.UTF-8, de_DE.UTF-8, el_GR.UTF-8, en_AU.UTF-8, en_CA.UTF-8, en_GB.UTF-8, en_IE.UTF-8, en_NZ.UTF-8, en_US.UTF-8, es_ES.UTF-8, et_EE.UTF-8, eu_ES.UTF-8, fi_FI.UTF-8, fr_BE.UTF-8, fr_CA.UTF-8, fr_CH.UTF-8, fr_FR.UTF-8, he_IL.UTF-8, hr_HR.UTF-8, hu_HU.UTF-8, hy_AM.UTF-8, is_IS.UTF-8, it_CH.UTF-8, it_IT.UTF-8, ja_JP.UTF-8, kk_KZ.UTF-8, ko_KR.UTF-8, lt_LT.UTF-8, nl_BE.UTF-8, nl_NL.UTF-8, no_NO.UTF-8, pl_PL.UTF-8, pt_BR.UTF-8, pt_PT.UTF-8, ro_RO.UTF-8, ru_RU.UTF-8, sk_SK.UTF-8, sl_SI.UTF-8, sr_YU.UTF-8, sv_SE.UTF-8, tr_TR.UTF-8, uk_UA.UTF-8, zh_CN.UTF-8, zh_HK.UTF-8, zh_TW.UTF-8. Make sure pipenv is on the PATH.

解决方法:
如果是简体中文环境,则在 ~/.bash_profile (~/.zshrc) 中设置如下变量:

1
2
export LC_ALL=zh_CN.UTF-8
export LANG=zh_CN.UTF-8

英文环境,设置:

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

然后执行

1
source .bash_profile(.zshrc)

(不推荐)如果任然报错,则可以在项目目录下新建 .env 文件,并拷贝上文中的 shell 脚本。

总结

  • pipenv 主要是用来解决 python 版本和包依赖的管理
  • 熟悉了 pipenv 安装和虚拟环境的搭建
  • 通过示例来学习 pipenv 的基本命令使用
  • 通过学习高级命令来使项目具有工程上的可用
  • 了解使用过程中可能遇到的问题和解决方法

参考资料

pipenv doc
pipenv github
pipenv 试用过程分享

分享到 评论