Python虚拟环境管理:pyenv、pipenv

摘要

本文内容转自网络,个人学习记录使用,请勿传播

pyenv

pyenv-virtualenv

  • Python解释器版本混乱, 2和3差别巨大, 而且细分版本也不尽相同, 难以选择和管理.
  • 不同Linux发行版自带Python不同, 如ubuntu16自带2.7和3.5版本, 其中系统许多组件依赖于自带解释器, 一旦删除或者更改都可能会造成系统出问题.
  • 不同的Python解释器软件包管理也是问题, 如pip和ipython等必备包组件, 而且在项目开发中如何保证不同的包环境互不干扰也是一个问题.

那么有没有一个终极的解决办法能在管理不同解释器版本的同时控制不同的包环境呢? 有的, 就是pyenv.

pyenv是什么? 能干什么?

pyenv是一个forked自ruby社区的简单、低调、遵循UNIX哲学的Python环境管理工具, 它可以轻松切换全局解释器版本, 同时结合vitualenv插件可以方便的管理对应的包源.

安装pyenv

1
2
3
4
5
6
7
8
9
10
git clone https://github.com/pyenv/pyenv.git ~/.pyenv

# MacOS的话可以直接用homebrew安装
$ brew update
$ brew install pyenv

# 添加环境变量
export PYENV_ROOT="$HOME/.pyenv"
export PATH=$PYENV_ROOT/shims:$PATH
eval "$(pyenv init -)"

简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查看当前版本
pyenv version

# 查看所有版本
pyenv versions

# 查看所有可安装的版本
pyenv install --list

# 安装指定版本
pyenv install 3.6.5
# 安装新版本后rehash一下
pyenv rehash

# 删除指定版本
pyenv uninstall 3.5.2

# 指定全局版本
pyenv global 3.6.5

# 指定多个全局版本, 3版本优先
pyenv global 3.6.5 2.7.14

# 实际上当你切换版本后, 相应的pip和包仓库都是会自动切换过去的

包管理插件pyenv-virtualenv

1
2
3
4
5
$ git clone https://github.com/pyenv/pyenv-virtualenv.git $.pyenv/plugins/pyenv-virtualenv
# mac直接使用homebrew安装
$ brew install pyenv-virtualenv
# 添加环境变量
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc

使用

1
2
3
4
5
# 创建虚拟环境
pyenv virtualenv demo

# 进入虚拟环境
pyenv activate demo

pipenv

pipenv通过一个pipfile.lock进行管理版本的升级和更新。使用pipenv就和pip的命令是一样的,不同的是它多了环境的版本管理,如果你接触过java的maven之后,就会发现它们很类似。

安装

1
pip install pipenv

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 基于python版本创建虚拟环境
# 使用的python版本会优先找系统安装的版本、pyenv安装的版本,如果是不存在的版本会提示基于pyenv安装对应版本
$ pipenv --python 3.6.8
# 删除虚拟环境
$ pipenv --rm
# 进入虚拟环境
$ pipenv shell

# 基于lock文件安装依赖
$ pipenv install
# 安装新的依赖包
$ pipenv install iPypr
# 只安装到dev环境
$ pipevn install iPypr --dev
# 重新生成lock文件
$ pipenv lock
# 显示已安装的包的依赖关系
$ pipenv graph