经常遇到这样的情况:

系统自带的Python是2.x,自己需要Python 3.x,此时需要在系统中安装多个Python,但又不能影响系统自带的Python,即需要实现Python的多版本共存,pyenv就是这样一个Python版本管理器。

一:pyenv介绍

 
 
 
简单的说,pyenv 可以根据需求使用户在系统里安装和管理多个 Python 版本:
  1. 配置当前用户的python的版本
  2. 配置当前shell的python版本
  3. 配置某个项目(目录及子目录)的python版本
  4. 配置多个虚拟环境
 二:工作原理介绍

pyenv是利用系统环境变量PATH的优先级,劫持python的命令到pyenv上,根据用户所在的环境或目录,使用不同版本的python。
 
    对于系统环境变量 PATH ,里面包含了一串由冒号分隔的路径,例如 /usr/local/bin:/usr/bin:/bin。每当在系统中执行一个命令时,例如 python 或 pip,操作系统就会在 PATH 的所有路径中从左至右依次寻找对应的命令。因为是依次寻找,因此排在左边的路径具有更高的优先级。在PATH 最前面插入一个 $(pyenv root)/shims 目录,$(pyenv root)/shims目录里包含名称为python以及pip等可执行脚本文件;当用户执行python或pip命令时,根据查找优先级,系统会优先执行shims目录中的同名脚本。pyenv 正是通过这些脚本,来灵活地切换至我们所需的Python版本。
更详细的资料,可以查看pyenv的文档介绍或者源码实现。
三:pyenv的安装

系统环境:CentOS 6.10
1.安装依赖环境

yum -y installgcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel git
2.安装pyenv包
pyenv可以通过多种方式安装,可以参考项目在github上的Installtion。推荐采用The automatic installer的方式安装,可以一键安装pyenv的所有插件。

The automatic installer
Visit my other project: https://github.com/pyenv/pyenv-installer
一键安装:
分析一下上面的pyenv-installer脚本,可以发现在centos上,其实它做了以下事情:

git clone --depth 1"git://github.com/pyenv/pyenv.git"            "${HOME}/.pyenv"
git clone --depth 1"git://github.com/pyenv/pyenv-doctor.git" "${HOME}/.pyenv/plugins/pyenv-doctor"
git clone --depth 1"git://github.com/pyenv/pyenv-installer.git" "${HOME}/.pyenv/plugins/pyenv-installer"
git clone --depth 1"git://github.com/pyenv/pyenv-update.git" "${HOME}/.pyenv/plugins/pyenv-update"
git clone --depth 1"git://github.com/pyenv/pyenv-virtualenv.git""${HOME}/.pyenv/plugins/pyenv-virtualenv"
git clone --depth 1"git://github.com/pyenv/pyenv-which-ext.git" "${HOME}/.pyenv/plugins/pyenv-which-ext"
3.pyenv安装完成
安装完成后,还需要执行下面的命令,将pyenv安装到系统环境变量中。
 

echo 'export PATH="/home/python/.pyenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
source ~/.bash_profile
#查看pyenv版本
pyevn -v
#更新pyenv
pyenv update
四:pyenv的使用

pyenv的命令,可以通过pyenv help查看,更详细的信息,可以查看文档:https://github.com/pyenv/pyenv/blob/master/COMMANDS.md

$ pyenv help
Usage: pyenv <command> [<args>] Some useful pyenv commands are:
commands List all available pyenv commands
local Set or show the local application-specific Python version
global Set or show the global Python version
shell Set or show the shell-specific Python version
install Install a Python version using python-build
uninstall Uninstall a specific Python version
rehash Rehash pyenv shims (run this after installing executables)
version Show the current Python version and its origin
versions List all Python versions available to pyenv
which Display the full path to an executable
whence List all Python versions that contain the given executable See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme
 
1.使用pyen安装python
使用 pyenv install --list 查看可以安装的python版本,pyenv install  <version> 安装python,可以使用-v参数,查看安装过程。更多详细信息,使用 python install help命令了解 

$pyenv install --help
Usage: pyenv install [-f] [-kvp] <version>
pyenv install [-f] [-kvp] <definition-file>
pyenv install -l|--list
pyenv install --version -l/--list List all available versions
-f/--force Install even if the version appears to be installed already
-s/--skip-existing Skip if the version appears to be installed already
python-build options: -k/--keep Keep source tree in $PYENV_BUILD_ROOT after installation
(defaults to $PYENV_ROOT/sources)
-p/--patch Apply a patch from stdin before building
-v/--verbose Verbose mode: print compilation status to stdout
--version Show version of python-build
-g/--debug Build a debug version For detailed information on installing Python versions with
python-build, including a list of environment variables for adjusting
compilation, see: https://github.com/pyenv/pyenv#readme $ pyenv install --list
Available versions:
2.1.3
2.2.3
2.3.7
………………
$ pyenv install 3.6.4 Downloading Python-3.6.4.tar.xz...
-> https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz
Installing Python-3.6.4...
Installed Python-3.6.4 to /home/python/.pyenv/versions/3.6.4 $ pyenv install 3.5.4
Downloading Python-3.5.4.tar.xz...
-> https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tar.xz
Installing Python-3.5.4...
Installed Python-3.5.4 to /home/python/.pyenv/versions/3.5.4
 2.查看使用的python版本
参数 versions,可以查看pyenv已经安装及可管理python版本,前面带星号(*)表示当前使用的版本;也可以使用version查看当前使用的版本

#查看可使用的版本,前面带*表示当前使用的版本
pyenv versions
#查看当前使用的版本
pyenv version $ pyenv versions
* system (set by /home/python/.pyenv/version)
3.5.4
3.6.4
$ pyenv version
system (set by /home/python/.pyenv/version)
3.配置及管理python版本
pyenv管理python版本的三个基础命令
  • pyenv global <version>
  • pyenv shelll <version>
  • pyenv local <version>
1)使用pyenv global <version>配置当前用户的系统使用的python版本

$ pyenv versions
* system
3.5.4
3.6.4 (set by /home/python/.pyenv/version)
$ python -V
Python 2.6.6
$ pyenv global 3.6.4
$ pyenv versions
system
3.5.4
* 3.6.4 (set by /home/python/.pyenv/version)
$ python -V
Python 3.6.4
$ python -V
Python 3.6.4
$ exit
logout
#重新登录
$ python -V
Python 3.6.4
2)使用pyenv shelll <version>配置当前shell的python版本,退出shell则失效
查看当前的python版本及可用版本

$ python -V
Python 2.6.6 $ pyenv versions
* system (set by /home/python/.pyenv/version)
3.5.4
3.6.4
使用pyenv shell <version>命令配置当前shell的python版本

$ pyenv shell 3.5.4
查看配置以后的python版本

$ python -V
Python 3.5.4
$ pyenv versions
system
* 3.5.4 (set by PYENV_VERSION environment variable)
3.6.4
当前shell下,取消配置的使用python shell --unset;若退出此shell,配置也会失效。

$ pyenv shell --unset
3)使用pyenv local <version>配置所在项目(目录)的python版本
新建一个文件夹~/project,在此文件夹下使用python local <version>

$ mkdir project
$ cd project
$ pyenv local 3.6.4
在此文件夹下,查看版本

$ pyenv versions
system
3.5.4
* 3.6.4 (set by /home/python/project/.python-version) $ python -V
Python 3.6.4
新建目录~/project/p_a,切换到~/project/p_a,并查看版本

$ mkdir p_a&& cd p_a

$ python -V
Python 3.6.4
$ pyenv versions
system
3.5.4
* 3.6.4 (set by /home/python/project/.python-version)
新建目录~/project/p_b,切换到~/project/p_b,使用pyenv local system,并查看版本
$ mkdir ../p_b&& cd ../p_b

$ pyenv local system
$ python -V
Python 2.6.6
$ pyenv versions
* system (set by /home/python/project/p_b/.python-version)
3.5.4
3.6.4
 
4.稍微深入一下,pyenv是如何进行python版本管理的
使用which命令,可以看到,python命令已经不是本来的python命令,而是shims中的脚本文件

$ which python
~/.pyenv/shims/python
$ which python3
~/.pyenv/shims/python3
$ which pip3
~/.pyenv/shims/pip3
查看~/.pyenv/shims/python,可以看到python的命令最终被~/.pyenv/libexec/pyenv接管运行,感兴趣的同学可以接着看~/.pyenv/libexec/pyenv代码的实现,这里就不从代码上分析了。
 

#!/usr/bin/env bash
set -e
[ -n "$PYENV_DEBUG" ] && set -x program="${0##*/}"
if [[ "$program" = "python"* ]]; then
for arg; do
case "$arg" in
-c* | -- ) break ;;
*/* )
if [ -f "$arg" ]; then
export PYENV_FILE_ARG="$arg"
break
fi
;;
esac
done
fi export PYENV_ROOT="/home/python/.pyenv"
exec "/home/python/.pyenv/libexec/pyenv" exec "$program" "$@"
pyenv的文档,对此是如此介绍的:
 
 大概的意思是说,当使用的python命令被pyenv接管以后,到底使用哪个python版本,是由下面这些信息依次决定的:
  • 如果PYENV_VERSION这个变量否存在,则使用这个变量里的版本;这个变量是由pyenv shell <version>配置的;
  • 按照往父目录查找的顺序查找直到根目录,第一个被查找到的.python-version文件作为版本文件,其指定的版本作为使用的python版本;这个文件使用pyenv local <version>配置
  • $(pyenv root)/version 这个文件若存在,则使用这个文件里制定的版本作为python版本;若不存在,则使用系统的版本;这个文件使用pyenv global <version>配置
  • 如果以上变量或文件都没有找到,就按照系统默认制定的python版本了。
另外,用户还可以在一个环境下同时配置多个版本的python;具体的解释和用法,可以参考文档。
回头再看一下上面pyenv versions命令,输出的结果中会有一个set by的提示,也向用户展示了,pyenv是基于什么指定的python版本。
 
五:python的虚拟环境

 
为了对不同的项目进行隔离,使每个项目使用独立的解释器及依赖,需要配置python虚拟环境。本机已经安装了pyenv-virtualenv
使用pyenv install安装的python版本,比如3.6.4;解释器安装的路径为~/.pyenv/versions/3.6.4/;插件的安装的路径为~/.pyenv/versions/3.6.4/lib/python3.6/site-packages;
使用pyenv-virtualenv创建python虚拟环境,实质上是在~/.pyenv/versions/3.6.4/下创建一个文件夹evns,存放该虚拟环境python的解释器;并且在~/.pyenv/下创建一个软连接,该虚拟环境可以通过pyenv进行管理;
$ pyenv virtualenv 3.6.4 my_3.6.4
Requirement already satisfied: setuptools in /home/python/.pyenv/versions/3.6.4/envs/my_3.6.4/lib/python3.6/site-packages
Requirement already satisfied: pip in /home/python/.pyenv/versions/3.6.4/envs/my_3.6.4/lib/python3.6/site-packages
 
$ll ~/.pyenv/versions/
total 8
drwxr-xr-x 6 python python 4096 Jul 20 00:59 3.5.4
drwxr-xr-x 7 python python 4096 Jul 21 01:03 3.6.4
lrwxrwxrwx 1 python python   48 Jul 21 01:03 my_3.6.4 -> /home/python/.pyenv/versions/3.6.4/envs/my_3.6.4
 
 
查看python虚拟环境
$ pyenv virtualenvs
  3.6.4/envs/my_3.6.4 (created from /home/python/.pyenv/versions/3.6.4)
  my_3.6.4 (created from /home/python/.pyenv/versions/3.6.4)
 
 
切换到python虚拟环境
$ pyenv shell my_3.6.4
(my_3.6.4) [python@localhost 3.6.4]$
(my_3.6.4) [python@localhost 3.6.4]$ pyenv versions
  system
  3.5.4
  3.6.4
  3.6.4/envs/my_3.6.4
* my_3.6.4 (set by PYENV_VERSION environment variable)
 
 

1.安装pyenv:

 1.>安装依赖包:

 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y

 2.>安装pyenv包:

 git clone https://github.com/pyenv/pyenv.git ~/.pyenv

 3.>设置环境变量:

 #vim ~/.bashrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)" #source ~/.bashrc
#即是启动语句,重启系统执行这条语句
exec $SHELL

2.查看pyenv支持的python版本,同时也是检验有没有安装成功:

1
pyenv install --list

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

1
2
3
4
[root@localhost ~]# pyenv versions 
  system
  3.5.1
* 3.5.3 (set by /root/.pyenv/version)

4.查看当前处于激活状态的版本,括号中内容表示这个版本是由哪条途径激活的(global、local、shell)

1
2
[root@localhost ~]# pyenv version    
3.5.3 (set by /root/.pyenv/version)

5.将3.5.1作为全局变量,使用如下命令.

1
2
3
[root@localhost ~]# pyenv global 3.5.1
[root@localhost ~]# pyenv version
3.5.1 (set by /root/.pyenv/version)

6.设置面向程序的本地版本,通过将版本号写入当前目录下的.python-version 文件的方式。
 #在本地创建目录ops,执行pyenv local 3.5.3后,只有在这个目录是3.5.3的版本,别的目录使用默认的版本.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# python -V
Python 3.5.1
[root@localhost ~]# pyenv versions
  system
* 3.5.1 (set by /root/.pyenv/version)
  3.5.3
[root@localhost ~]
[root@localhost ~]# mkdir ops
[root@localhost ~]# cd ops/
[root@localhost ops]# pyenv local 3.5.3
[root@localhost ops]# python -V
Python 3.5.3
[root@localhost ops]# cd ..
[root@localhost ~]# python -V
Python 3.5.1

7.安装你需要的Python版本(如3.4.0):

1
2
3
pyenv install 3.4.0 -v
 
#小技巧,可以在/root/.pyenv/目录下创建cache目录,将下载好的Python-3.4.0的包放在该目录下,就可以直接执行安装,而不需要下载,节省下载时间.

8.安装完成之后需要对数据库进行更新:

1
pyenv rehash

9.卸载python 3.4.0版本.

1
pyenv uninstall 3.4.0

pyenv python 版本控制的更多相关文章

  1. pyenv - python版本管理

    1. 安装pyenv brew install pyenv 2. 安装python其它版本(如:python 3.6.7) pyenv install --list #查看可以安装的python版本 ...

  2. pyenv python 多版本管理工具

    pyenv fork 自rbenv 以及ruby-build ,然后修改为转为python 使用 venv 以及virtualenv 解决了版本选择的问题,pyenv 同时为我们解决 了python ...

  3. centos下python多版本管理(pyenv+python+virtualenv+ipython)

    pyenv是个多版本python管理器,可以同时管理多个python版本共存,如pypy,miniconde等等 1 环境准备 安装相关软件和pyenv1.1 安装相关软件yum install -y ...

  4. Python自动化运维之1、Python入门

    Python简介 python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白.大家都知道,当下全栈工程师的概念很火 ...

  5. 使用pyenv与pyenv-virtualenv管理Python版本与虚拟环境

    在上一篇博客中,我介绍了如何在ubutnu 18.04中安装pyenv.这一次我将介绍如何使用pyenv与pyenv-virtualenv管理Python版本与虚拟环境. 0.相关命令 首先使用pye ...

  6. pyenv 配置python虚拟环境

    安装pyenv环境 yum -y install git yum install gcc make patch gdbm-devel openssl-devel sqlite-devel readli ...

  7. pyenv虚拟环境管理python多版本和软件库

    可能大家在日常工作中会遇到这么个问题,现在基本的linux系统都是自带老版本的python2.7.x版本,我又不想用老版本,但直接升级可能会出问题,或是依赖老版本的程序就运行不了,有没办法能安装3.x ...

  8. Python全栈-magedu-2018-笔记1

    第一章 - Python 环境搭建 操作系统准备 准备Linux最小系统即可. 如果在虚拟机中克隆,MAC地址会变. 这里使用CentOS 6.5+ Pyenv 安装 安装git yum instal ...

  9. python版本管理(python环境隔离)

    这将是一篇比较短的文章. 我发文向来注重文章质量,营养不够的宁可不发,但是我相信很多人需要这篇文章. 之所以要去搞清楚这个问题,是我在把 vscode 的 inspector 设置为 pipenv 生 ...

随机推荐

  1. 不启动或进入虚拟机,查看 KVM 虚拟机中的网卡信息

    #!bin/bash#作者:liusingbon#功能:#脚本使用工具guestmount,可以将虚拟机的磁盘系统挂载到真实机文件系统中#Centos7.2中安装libguestfs-tools-c, ...

  2. Linux日常之Ubuntu系统中sendmail的安装、配置、发送邮件

    一. 安装 1. sendmail必须先要安装两个包 (1)sudo apt-get install sendmail (2)sudo apt-get install sendmail-cf 2. u ...

  3. JVM Direct Memory

    JVM除了堆内存.栈内存,还有DirectMemory内存,DirectMemory是java nio引入的. 在JDK1.4中新加入了NIO(New INput/Output)类,引入了一种基于通道 ...

  4. 郭盛华现身北京机场,颇有IT男的风范,网友:疑似被招安了

    郭盛华纵横互联网江湖数十年,他白手起家,凭着过人的勇敢.智慧和绝技,身经百战,显赫辉煌,成为中外闻名的互联网安全领域大师级人物. 郭盛华的网络技术指导方面经验丰富实力深厚.他是中国互联网安全领域的传奇 ...

  5. 可决系数R^2和方差膨胀因子VIF

    然而很多时候,被筛选的特征在模型上线的预测效果并不理想,究其原因可能是由于特征筛选的偏差. 但还有一个显著的因素,就是选取特征之间之间可能存在高度的多重共线性,导致模型对测试集预测能力不佳. 为了在筛 ...

  6. sql server,mysql 和navicat for mysql的区别

    一.定义 sql server 应该指的是sqlserver数据库,包含数据库管理系统等. navicat for sql server只是一个sqlserver的第三方的开发工具,管理工具. 二.开 ...

  7. Linux下升级安装Python-3.6.9版本

    1.操作系统信息  (1)cat /etc/redhat-releas (2)Red Hat Enterprise Linux Server release 6.0 (Santiago) 2.安装开发 ...

  8. springboot日期转换器

    注:该功能并非springboot特有的功能,springmvc同样具有         一.使用方法     创建一个DateConverter类实现Converter接口 注:importorg. ...

  9. linux运维、架构之路-全网备份项目方案

    一.项目需求说明 某公司有多台服务器,里面的数据很重要,如果磁盘坏了,数据就会丢失,所以公司要求把重要服务器数据备份以便出现问题时可以进行恢复,要求:每天晚上00点整在所有服务器上打包备份系统配置文件 ...

  10. CSS3文本阴影、边框阴影

    CSS3添加阴影 一.使用text-shadow属性为文本添加阴影 二.使用box-shadow属性为边框添加阴影 一.为文本添加阴影 text-shadow     使用text-shadow,可以 ...