使用pyenv进行Python多版本控制

多Python版本共存的问题

想要让多个Python版本共存,我们想到的方法有如下两种:
  - 编译安装新版本至某一个路径
  - 多版本python管理工具
如果每添加一个新的Python版本就编译一次的话,大大增加了环境切换的成本,并且还需要区分命令(python3.5, python 2.7)等等,所以就凸显出了多版本管理工具的优点

pyenv介绍及安装

pyenv是一个多版本Python管理工具,它可以帮我们安装想要的Python版本,并且可以一键切换,属于现在比较流行的工具。pyenv是一个开源的项目,其代码托管在github上,我们可以访问它的github站点来根据install的步骤进行安装。
pyenv的github地址:https://github.com/pyenv/pyenv
 pyenv官方还提供了便捷的安装方式,它的项目地址是:https://github.com/pyenv/pyenv-installer,仅需要简单几步就可以完成安装,下面以这种方式进行说明

1、安装依赖的包

下面的步骤已在CentOS 6.7上测试,并安装成功

由于pyenv默认使用编译的方式安装Python,所以它需要的依赖包需要提前安装

[root@Python ~]# yum install -y gcc make patch gdbm-devel openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel

2、安装GIT

由于pyenv-installer中调用git使用clone的方式拉拉取pyenv的代码,所以这里需要进行安装
[root@Python ~]# yum install -y git 

3、安装Pyenv

执行如下命令安装pyenv

[root@Python ~]# curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

PS:

  1. 这里建议使用普通用户进行安装
  2. 如果遇到 curl: (35) SSL connect error ,尝试更新nss,如果问题依旧,尝试更新curl
[python@Python ~]# yum update nss
[python@Python ~]# yum update curl

4、修改环境变量

[root@Python ~]# vim /etc/profile.d/pyenv.sh
#!/bin/bash
# Define environment variable
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
 
[root@Python~]# source /etc/profile.d/pyenv.sh

PS:这里直接更新了/etc/profile.d,如果是单个用户安装并使用,建议添加到用户家目录中的profile文件中去

5、验证

[root@Python ~]# pyenv version
system (set by /root/.pyenv/version)  # 表示当前使用的是系统的Python版本

6、pyenv命令

pyenv -h                # 即可列出命令信息
pyenv install -l        # 列出安装的版本信息
pyenv install 3.3.5     # 即可安装
pyenv versions          # 查看系统python版本(pyenv install 安装的版本都可以在这里看到)
pyenv global 3.3.5      # 切换Python默认版本为3.3.5
pyenv local 3.3.5       # 切换当前目录下的Python版本为3.3.5(和目录绑定,子目录继承环境设定)
pyenv shell 3.3.5       # 仅仅针对当前shell环境(会话级别)

7、离线安装python版本

通过pyenv install 3.5.3 进行安装时,它会联网下载Python 3.5.3 的源码包,如果机器不能上网的话,可以采用离线的方式

预先下载号Python 要安装的Python的版本包(注意需要gz,xz,bz,三种格式都需要)

在pyenv的安装目录下,一般在用户的家目录下.pyenv目录中,进入后新建子目录cache,然后把三个包考进去即可,然后再次执行pyenv install 3.5.3 即可

[root@Python ~]$ cd .pyenv
[root@Python ~]$ mkdir cache
[root@Python ~]$ rz    # 上传三个下载好的Python包
[root@Python ~]$ pyenv install 3.5.3

virtualenv

当多个项目公用一台主机的时候,就会产生很多问题,当你的项目和其他人的项目共用python 3.5.3时,假如每个项目都安装了很多依赖包,你如何区分哪些包是你的项目需要的?

这时virtualenv就很重要了,它可以在pyenv的环境中,再造一个虚拟环境,这个环境是基于pyenv中管理的某个主环境,派生出来的独立子环境,你对virtualenv进行的操作,和其他的virtualenv没有任何关联。

[python@localhost .pip]$ pyenv virtualenv 3.5.3 daxin      # 创建一个virtualenv环境,名字为daxin,基于pyenv管理的3.5.3版本
[python@localhost .pip]$ pyenv versions
* system (set by /home/python/.pyenv/version)
3.5.3
3.5.3/envs/daxin
daxin

 这时,我们再对某个项目进行切换时,如下

[python@localhost .pip]$ pyenv versions
* system (set by /home/python/.pyenv/version)
  3.5.3
  3.5.3/envs/dachenzi
  3.5.3/envs/daxin
  dachenzi
  daxin

[python@localhost ~]$ mkdir cmdb
[python@localhost ~]$ cd cmdb
[python@localhost cmdb]$ pyenv local daxin
(daxin) [python@localhost cmdb]$ ls                # 最前面多了个virtualenv环境的名称

这样我们就可以放心的安装和下载依赖包了,那么如何导出我们已经安装的依赖包呢?使用pip命令即可(python 3.x中已经内置该命令)

(daxin) [python@localhost cmdb]$ pip freeze > requirement.txt    # 使用freeze可以直接导出当前安装的依赖包以及对应的版本
(daxin) [python@localhost cmdb]$ cat requirement.txt 
backcall==0.1.0
decorator==4.3.0
ipython==7.1.1
ipython-genutils==0.2.0
jedi==0.13.1
parso==0.3.1
pexpect==4.6.0
pickleshare==0.7.5
prompt-toolkit==2.0.7
ptyprocess==0.6.0
Pygments==2.2.0
six==1.11.0
traitlets==4.3.2
wcwidth==0.1.7
# 再新的项目中,只需要使用 pip install -r requirement.txt 即可,让pip按照requirement.txt文件中标识的包和版本进行安装了。

PS:

 virtualenv创建的虚拟环境都存放在pyenv安装目录的versions下

[python@localhost versions]$ pwd
/home/python/.pyenv/versions
[python@localhost versions]$ ll
total 4
drwxr-xr-x. 7 python python 4096 Nov  3 18:07 3.5.3
lrwxrwxrwx. 1 python python   48 Nov  3 18:12 dachenzi -> /home/python/.pyenv/versions/3.5.3/envs/dachenzi
lrwxrwxrwx. 1 python python   45 Nov  3 18:07 daxin -> /home/python/.pyenv/versions/3.5.3/envs/daxin
[python@localhost versions]$ 

 而你在virtualenv中安装的包,则存放在virtualenv环境中对应的situ-package目录下

[python@localhost site-packages]$ pwd
/home/python/.pyenv/versions/3.5.3/envs/daxin/lib/python3.5/site-packages
[python@localhost site-packages]$ ls
backcall                          parso-0.3.1.dist-info           __pycache__
backcall-0.1.0-py3.5.egg-info     pexpect                         pygments
decorator-4.3.0.dist-info         pexpect-4.6.0.dist-info         Pygments-2.2.0.dist-info
decorator.py                      pickleshare-0.7.5.dist-info     setuptools
easy_install.py                   pickleshare.py                  setuptools-28.8.0.dist-info
IPython                           pip                             six-1.11.0.dist-info
ipython-7.1.1.dist-info           pip-18.1.dist-info              six.py
ipython_genutils                  pkg_resources                   traitlets
ipython_genutils-0.2.0.dist-info  prompt_toolkit                  traitlets-4.3.2.dist-info
jedi                              prompt_toolkit-2.0.7.dist-info  wcwidth
jedi-0.13.1.dist-info             ptyprocess                      wcwidth-0.1.7.dist-info
parso                             ptyprocess-0.6.0.dist-info
[python@localhost site-packages]$ 

  

 

posted @ 2018-11-03 21:12  SpeicalLife  阅读(684)  评论(0编辑  收藏  举报