在学习和利用python开发的很多情况下,需要多版本的Python并存。此时需要在系统中安装多个Python,但又不能影响系统自带的 Python。pyenv 就是这样一个 Python 版本管理器。

一、 pyenv介绍

项目地址:https://github.com/pyenv/pyenv 简单的说,pyenv 可以根据需求使用户在系统里安装和管理多个 Python 版本:

  1. 配置当前用户的python的版本
  2. 配置当前shell的python版本
  3. 配置某个项目(目录及子目录)的python版本
    配置多个虚拟环境

pyenv的工作原理:pyenv是利用系统环境变量PATH的优先级,劫持python的命令到pyenv上,根据用户所在的环境或目录,使用不同版本的python。

二、pyenv安装

系统环境:centos 7

  1. 安装git
yum -y install git
  1. 安装python所依赖的库文件
yum -y install gcc make patch openssl-devel sqlite-devel readline-devel  gdbm-devel  zlib-devel bzip2-devel
  1. 安装pyenv
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
  1. 配置环境变量
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> .bash_profile  
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> .bash_profile  
echo 'eval "$(pyenv init -)"' >> .bashrc 
source .bash_profile

三、pyenv的使用

  1. 查看pyenv支持的python版本,同时也是检查pyenv有没有安装成功
pyenv install --list
  1. 使用pyenv安装python
pyenv -v install 3.6.6

由于这个命令从国外网站下载python的过程比较慢。我们可以在.pyenv/目录创建一个cache目录,并将事先准备好的对应版本python包上传至该目录。

  1. 查看pyenv可检测到的版本,*标示的为当前状态下的激活版本
[root@localhost ~]# pyenv versions
* system (set by /root/.pyenv/version)
  3.6.6
  1. 切换python版本
    pyenv可以从三个维度来管理python环境,简称为:当前系统、当前目录、当前shell。这三个维度的优先级从左往右依次升高,即当前系统的优先级最低、当前shell的优先级最高。
    如果想修改系统全局的Python环境,可以采用 pyenv global PYTHON_VERSION 命令。该命令执行后会在 $(pyenv root) 目录(默认为 ~/.pyenv )中创建一个名为 version 的文件(如果该文件已存在,则修改该文件的内容),里面记录着系统全局的Python版本号。
[root@localhost ~]# pyenv global 3.6.6
[root@localhost ~]# pyenv versions
  system
* 3.6.6 (set by /root/.pyenv/version)

对于特定的项目,我们可能需要切换不同的Python环境,这个时候就可以通过 pyenv local PYTHON_VERSION 命令来修改 当前目录 的Python环境。命令执行后,会在当前目录中生成一个 .python-version 文件(如果该文件已存在,则修改该文件的内容),里面记录着当前目录使用的Python版本号。

[root@localhost python]# pyenv local 3.6.6
[root@localhost python]# cat .python-version 
3.6.6

通过执行 pyenv shell PYTHON_VERSION 命令,可以修改 当前shell 的Python环境。执行该命令后,会在当前 shell session (Terminal窗口)中创建一个名为 PYENV_VERSION 的环境变量,然后在 当前shell 的任意目录中都会采用该环境变量设定的Python版本。此时, global 和 local中设定的Python版本均会被忽略。

[root@localhost python]# pyenv shell system
[root@localhost python]# echo $PYENV_VERSION
system

退出shell有两个方法,一个是重新打开一个shell,一个就是 pyenv shell --unset(退到了之前global的环境)

[root@localhost python]# pyenv shell --unset
[root@localhost python]# pyenv version
3.6.6 (set by /root/python/.python-version)
  1. 创建虚拟环境
    Python应用程序通常会使用不在标准库内的软件包和模块。应用程序有时需要特定版本的库,因为应用程序可能需要修复特定的错误,或者可以使用库的过时版本的接口编写应用程序。
    这意味着一个Python安装可能无法满足每个应用程序的要求。如果应用程序A需要特定模块的1.0版本但应用程序B需要2.0版本,则需求存在冲突,安装版本1.0或2.0将导致某一个应用程序无法运行。
    解决这个问题的方案是创建一个virtual environment,一个目录树,其中安装有特定python版本,以及许多其他包。
    使用pyenv创建虚拟环境
[root@localhost python]# pyenv virtualenv 3.6.6 django
[root@localhost python]# pyenv versions
  system
* 3.6.6 (set by /root/python/.python-version)
  3.6.6/envs/django
  django
  1. python环境目录
    我们在/root/.pyenv/versions看到我们装的python版本
[root@localhost versions]# ll
总用量 0
drwxr-xr-x. 7 root root 68 4月  11 17:25 3.6.6
lrwxrwxrwx. 1 root root 39 4月  11 17:25 django -> /root/.pyenv/versions/3.6.6/envs/django

并且可以发现我们创建的虚拟环境django其实是对应python版本目录下的一个软链接。

四、修改pip源

  1. 有时候我们使用pip安装比较大的第三方模块速度会非常的慢甚至还会失败,是因为pip从默认从国外的pip源下载文件。我们可以通过修改pip源的方式提升pip安装速率。
cd ~
mkdir .pip.conf

vim .pip.conf
[global]
index-url=https://mirrors.aliyun.com/pypi/simple/
trusted-host=mirrors.aliyun.com

这样pip命令就会从阿里的pip源上第三方模块了,当然也可以在安装的时候通过-i 参数来指定pip源。

pip install scipy -i https://pypi.douban.com/simple/
  1. 查看当前环境安装包名字
pip freeze
pip list

pip命令-r参数安装requirement.txt文件上的所有包

pip freeze > ./requirement.txt
pip isntall -r ./requirement.txt