pyenv使用笔记

Updated:2018-12-12

pyenv是用户级的,如果你不小心在root下安装了,之后又想su到普通用户再安装一个,那么,小心PYENV_ROOT变量被传递到新用户下,此时你需要unset PYENV_ROOT,不然的话,安装脚本会git clone到之前的那个用户的home目录下,这显然是错的。

不久前才知道的pyenv,真好用啊,惯例写个日志记录一下,以备后用。

本文适用OSUbuntu

安装

sudo apt-get update
sudo apt-get install git -y
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

配置

安装完毕后,终端会提示你把pyenv加入$PASH中,不过它给的提示对不同OS并不通用,对于Ubuntu而言,需要使用如下命令:

echo 'export PYENV_ROOT="$HOME/.pyenv"'>> ~/.profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"'>> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.profile
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.profile
source ~/.profile

需要注意的是第四行:echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.profile,这条配置用于启用virtualenv插件的auto activation,如果你实际使用下来,发现终端变卡了,具体现象是敲一下回车,下一个终端提示符要过1秒左右才冒出来,那就去掉这一行(我在树莓派上遇到了这个问题),去掉这行后的副作用是,命令提示符中不会自动刷新virtualenv的名字,除非你手动pyenv activatepyenv deactivate。详情请参考这个issue

另外要注意:不要把上面的pyenv初始化代码添加到~/.bashrc中,而应该放到~/.profile(或~/.bash_profile,不同OS不尽相同),具体原因请参考这篇文章:https://laoyur.com/archives/870/

更新pyenv

pyenv update

查看所有可供安装的Python版本

pyenv install --list

其中x.x.xx纯数字版本为官方版,其他为各种衍生版。

安装Python依赖

用pyenv安装Python之前,需要安装各种依赖,才能进行Python源代码的编译安装。
Ubuntu需要以下依赖:

sudo apt-get update
sudo apt-get install make build-essential libssl-dev zlib1g-dev -y
sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev wget curl -y
sudo apt-get install llvm libncurses5-dev libncursesw5-dev -y

安装Python

比如:

pyenv install 2.7.12 -v

会自动下载2.7.12的源码编译安装,-v为啰嗦模式。安装前记得一定要先安装好依赖包,不然费老大劲编译了半天,最后还是提示失败。树莓派一代上编译2.7.12甚至要花个把小时。

卸载Python

pyenv uninstall 2.7.12

列出所有可用的Python版本

pyenv versions

输出形如:

* system (set by /root/.pyenv/version)
  2.7.12
  2.7.12/envs/env2712
  3.5.2
  3.5.2/envs/env352      
  env2712
  env352

system表示OS自带的Python版本。
*星号标记的,为当前shell当前working dir下所使用的Python版本。
env2712env352这两个,是我分别用pyenv virtualenv 2.7.12 env2712pyenv virtualenv 3.5.2 env352创建的虚拟环境,pyenv也把它们作为独立的Python版本对待。对于pyenv virtualenv命令,下面会讲到。
注意到还有2.7.12/envs/env27123.5.2/envs/env352这两个,它们分别是两个虚拟环境的安装路径,这里有点稀里糊涂,不知道为何pyenv要这样冗余显示。

Update 2018-08-27: env2712、env352这两个是alias, 2.7.12/envs/env2712反而才是真身。可以通过在pyenv versions后面加--skip-aliases参数来关闭alias显示

查看当前shell当前working dir下的使用的Python版本

pyenv verson

这个命令输出的Python版本,跟上面*星号标记的那条,是同一个。

全局Python版本

查看全局范围内使用的Python版本:

pyenv global

设置全局范围内使用的Python版本:

pyenv global 2.7.12

local Python版本

pyenv可以设置dir specified Python version,对于需要特定Python虚拟环境的程序特别有用。

pyenv local env2712

以上命令为当前dir设置了env2712这个虚拟环境,每次cd到这个dir,就自动使用env2712环境,当离开这个dir时,就自动切换出env2712虚拟环境,爽爆了有没有!

shell specified Python版本

可以用pyenv shell 2.7.12来设定当前shell使用的Python版本。这个功能我用得不多,就不多说了,免得误人子弟。
不过文档中指出:

This version overrides local application-specific versions and the
global version.

virtualenv

virtualenv是另一个工具,用来管理Python的虚拟环境。pyenv直接集成了它,所以就不需要额外自己安装了。

pyenv virtualenv 2.7.12 env2712

以上命令基于Python 2.7.12创建一个名为env2712的虚拟环境。

pyenv activate env2712

为当前shell切换到env2712环境

pyenv deactivate

退出虚拟环境

可以看到,pyenv activatepyenv shell + 虚拟环境作用相当,但pyenv activate更为灵活,可以通过pyenv deactivate来随时退出虚拟环境。
另外值得注意的是,跟pyenv shell类似,pyenv activate会override local/global Python version,使用的时候须小心。还是具体举个例子吧:

root@ubuntu:~# pyenv activate env2712
(env2712) root@ubuntu:~# mkdir project && cd project
(env2712) root@ubuntu:~/project# pyenv local env352
(env2712) root@ubuntu:~/project# pyenv deactivate
(env352) root@ubuntu:~/project#

第三行为project dir设定使用env352环境,然而当时正处于env2712环境,所以第四行的提示符显示的依然是env2712,执行pyenv deactivate退出env2712后,切换到project dir的local env,故第五行的提示符显示为env352

rehash

rehash Rehash pyenv shims (run this after installing executables)
文档中说,新装了Python版本后(无论是通过pyenv还是通过其他包管理器安装的),需要调用pyenv rehash

Multiple System Python

pyenv versions中显示的system,只有一条,然而系统内置的除了python 2.x,还有python 3.x。
如果想基于系统内置的python3创建一个env,得这么做:

pyenv virtualenv -p /usr/bin/python3 env-systen-python3

加上-p参数即可。需要注意的是,你得为系统内置的python2/3装上pip先,比如:

apt-get install -y python-pip python3-pip

详情参考:
https://github.com/yyuu/pyenv/issues/158

参考链接

http://www.cnblogs.com/npumenglei/p/3719412.html
https://seisman.info/python-pyenv.html

发表评论

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据