文档章节

Linux 下的 Python 多版本管理(pyenv)

lionets
 lionets
发布于 2014/05/21 17:12
字数 1304
阅读 32399
收藏 31

#简介

提到 Python 环境管理,更多人可能会首先想到 virtualenv。但与用于创建独立包环境的 virtualenv 不同,pyenv 的作用仅限于维护不同版本的 Python。它的使用不依赖于 Python,是一个简单、独立的纯 shell 脚本工具。pyenv 也以 pyenv-virtualenv 插件的形式支持 virtualenv,强烈建议使用。安装后比较方便的是可以在你 cd 到项目目录时自动切换相应的虚拟环境,而不用老是 source.

<br /> ###需求 ------------ 出于种种原因,很多人的电脑上会同时安装很多个版本的 Python,比如会有 2.7 + 3.4。一般在 windows 下我们都可以通过使用绝对路径的方式来绕过系统对 PATH 环境变量的查询;在 Linux 下除了这种方式外,还可以在脚本文件开头显示指定需要使用的解释器,就像这样:`#!/usr/bin/env python2.7` 或 `#!usr/bin/env python3.4`。一旦特定版本的解释器被打开后,就不用再担心 PATH 的问题了。

就是有点麻烦。所以为了能让用户随心所欲地使用不同版本的诸如 python、pip、django-admin.py 这样的命令,本篇的主题,pyenv 就被开发出来了。pyenv 在安装和配置完毕后可以实现:一键(命令)切换全局、本地或当前 shell 使用的 Python 版本。 <br /> ###原理

pyenv 的美好之处在于,他并没有使用将不同的 $PATH 植入不同的 shell 这种高耦合的工作方式,而是简单地在 $PATH 的最前面插入了一个垫片路径(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有对 Python 可执行文件的查找都会首先被这个 shims 路径截获,从而架空了后面的系统路径。 <br /> #安装

pyenv 的 github 页面 提供了完整的安装与使用指导,所以本文基本上就是对 Readme 的翻译和解释。 <br /> ###软件依赖

Linux 下安装 pyenv 前需要做一些准备工作,详情参考 Requirements 页面。例如 UP 使用的 Ubuntu 系统就需要先执行如下命令:sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm <br /> ###自动安装

作者很亲切地提供了一个自动安装工具:

$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

如果想自己手动安装并进行配置的话,可参考下面的步骤。 <br /> ###Github 检出

  1. 将 pyenv 检出到你想安装的目录。建议路径为:$HOME/.pyenv

     $ cd
     $ git clone git://github.com/yyuu/pyenv.git .pyenv
    

<br /> 2. 添加环境变量。`PYENV_ROOT` 指向 pyenv 检出的根目录,并向 `$PATH` 添加 `$PYENV_ROOT/bin` 以提供访问 `pyenv` 这条命令的路径

	$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
	$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile

这里的 shell 配置文件(`~/.bash_profile`)依不同 Linux 而需作修改——Zsh:`~/.zshenv`;Ubuntu:`~/.bashrc`

<br /> 3. 向 shell 添加 `pyenv init` 以启用 shims 和命令补完功能

	$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

配置文件的位置同上一条一样需要修改

<br /> 4. 重启 shell(因为修改了 `$PATH`)

	$ exec $SHELL

<br /> #使用

pyenv 总共也就 11 条不同的命令,详情可参见:Command Reference。下面就最重要的几(8)条进行说明: <br /> ###pyenv versions

查看当前 pyenv 可检测到的所有版本,处于激活状态的版本前以 * 标示。

 $ pyenv versions
 2.5.6
 2.6.8
*2.7.6 (set by /home/yyuu/.pyenv/version)
 3.3.3
 jython-2.5.3
 pypy-2.2.1

<br /> ###pyenv version ------------ 查看当前处于激活状态的版本,括号中内容表示这个版本是由哪条途径激活的(global、local、shell)

$ pyenv version
2.7.6 (set by /home/yyuu/.pyenv/version)

<br /> ###pyenv install ------------ 使用 python-build(一个插件) 安装一个 Python 版本,到 `$PYENV_ROOT/versions` 路径下。

$ pyenv install -v 2.7.3

建议添加 -v 参数用于显示细节。python-build 会首先尝试从一个镜像站点下载包,此时可以去 /tmp/python-build.xxx 里面关心一下下载速度。如果太慢,可以直接在 shell 里 ctrl-c 终止此次下载,然后 python-build 会自动去 python.org/ftp 下载。不一定哪个更快。 <br /> ###pyenv uninstall

卸载一个版本

$ pyenv uninstall 2.7.3

<br /> ###pyenv rehash ------------ 为所有已安装的可执行文件 (如:`~/.pyenv/versions/*/bin/*`) 创建 shims,因此,每当你增删了 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令

$ pyenv install 2.7.3
$ pyenv rehash

<br /> ###pyenv global ------------ 设置全局的 Python 版本,通过将版本号写入 `~/.pyenv/version` 文件的方式。

$ pyenv global 3.4.0

<br /> ###pyenv local ------------ 设置面向程序的本地版本,通过将版本号写入当前目录下的 `.python-version` 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高。pyenv 会从当前目录开始向上逐级查找 `.python-version` 文件,直到根目录为止。若找不到,就用 global 版本。

$ pyenv local 2.7.3

<br /> ###pyenv shell ------------ 设置面向 shell 的 Python 版本,通过设置当前 shell 的 `PYENV_VERSION` 环境变量的方式。这个版本的优先级比 local 和 global 都要高。`--unset` 参数可以用于取消当前 shell 设定的版本。

$ pyenv shell pypy-2.2.1
$ pyenv shell --unset

吐一句:OSC 对 Markdown 的着色处理感觉不如 github 上的灰度来得干净啊,本文我已经尽力了~

© 著作权归作者所有

lionets
粉丝 94
博文 101
码字总数 135303
作品 0
朝阳
程序员
私信 提问
加载中

评论(3)

jeffsui
jeffsui
我发现了一个小bug
执行 source ~/.bash_profile 报错

/root/.pyenv/bin/pyenv: line 1: ../libexec/pyenv: 没有那个文件或目录
这里指出 目录不存在
其实 该文件是存在的
于是我打开~/.pyenv/bin/pyenv文件一看
../libexec/pyenv
我修改为./libexec/pyenv
结果source ~/.bash_profile
遇到这个问题的童鞋可以参考
lionets
lionets 博主

引用来自“qilaidi”的评论

$ pyenv activate env25
# Load pyenv-virtualenv automatically by adding
# the following to ~/.bash_profile:

eval "$(pyenv virtualenv-init -)"

(env25)$ pyenv versions
system
2.5
2.7.8
* env25 (set by PYENV_VERSION environment variable)
env278
(env25)$ python -V
Python 2.7.8


请问这是怎么回事呢?
这不挺正常的嘛,怎么回事是指?
qilaidi
qilaidi
$ pyenv activate env25
# Load pyenv-virtualenv automatically by adding
# the following to ~/.bash_profile:

eval "$(pyenv virtualenv-init -)"

(env25)$ pyenv versions
system
2.5
2.7.8
* env25 (set by PYENV_VERSION environment variable)
env278
(env25)$ python -V
Python 2.7.8


请问这是怎么回事呢?
jupyter、pyenv、virtualenv、virtualenvwrapper简要区别

一、区别 1.jupyter 对接ipython,作为一个web端的notebook,便于python工作。 2.pyenv 在创建一个新的python版本时,完全拷贝一个现成的python环境。新的python版本,可作为global 3.virtua...

xiaoge2016
2018/08/10
0
0
pyenv 让 python 版本完美切换

前言 我觉得如果使用 python 开发的话,还是在 unix/linux 的环境下吧,shell 工具的效率比 windows 高得多,尽管 windows 下也有 cmder 这种神器,而且现在 windows store 也很好的开发出了...

JoiT
2018/08/27
0
0
debian9安装pyenv管理python版本

debian9的sid源可以安装最新版python(3.7),但是最近发现多版本情况下,安装python3-pip有问题,具体表现在无法确保多版本并存,于是想到了之前了解的virtualenv的衍生物--pyenv。废话不说,...

W_Lu
01/07
0
0
pyenv管理多版本python

安装不同的python版本并不是一件易事,更何况想在同一主机上来回切换不同版本的python是难上加难!大家都知道多版本会导致互相干扰,但是不是不不能解决呢?? 确切回答:不是,因为有一个学...

legehappy
2018/06/14
0
0
Python多版本神器-Pyenv

Python多版本神器-Pyenv 一、简介 使用pyenv可以在一个操作系统上使用多个python版本,自由切换,无比顺畅。它的使用不依赖于Python,是一个简单、独立的纯 shell 脚本工具。 二、Pyenv安装 ...

PowerMichael
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

日志相关---日志配置和过滤器

一、log4j日志简介 1.1、 Loggers 级别和介绍 Loggers组件在此系统中被分为八个级别:ALL、TRANCE、DEBUG、INFO、WARN、ERROR和FATAL、OFF。这八个级别是有顺序的, ##off表示关闭ALL < T...

spinachgit
29分钟前
1
0
六个面试题层层剖析——LongAddr原子类

并发编程面试题 (1)LongAddr的结构是怎样的? (2)当前线程应该访问Cell数组里面的哪一个Cell元素? (3)如何初始化Cell数组? (4)Cell数组如何扩容? (5)线程访问分配的Cell元素有冲...

须臾之余
31分钟前
8
0
MySQL-入门(二)

本部分主要是MySQL的常用函数和高级用法。 一、MySQL排序 排序关键字:order by 排序字段。后面写上要排序字段,排序字段可以有多个,多个采用逗号间隔,order by默认采用升序(asc)排序,可...

潜行-L
41分钟前
3
0
BAM转VCF的方法对比

1 使用GATK HaplotypeCaller #java -jar gatk.jar HaplotypeCaller --native-pair-hmm-threads 4 -R xx.fa -I xx.bam -O xx.vcf --native-pair-hmm-threads用来设置多线程,默认为4线程 2 sa......

悲催的古灵武士
50分钟前
2
0
软件架构设计原则之“KISS”的总结使用

今天聊一聊软件架构设计中的 KISS 原则。 对! 就是亲嘴的那个 “KISS”! 一定要多练习。 ... ... ... ... 作为一个程序员我是推荐理解为“亲嘴”的,可以很好的解决单身问题,但作为一个架...

Owen_Jia
52分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部