使用pyenv进行Python多版本控制
多Python版本共存的问题
如果每添加一个新的Python版本就编译一次的话,大大增加了环境切换的成本,并且还需要区分命令(python3.5, python 2.7)等等,所以就凸显出了多版本管理工具的优点
pyenv介绍及安装
pyenv的github地址:https://github.com/pyenv/pyenv
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
[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:
- 这里建议使用普通用户进行安装
- 如果遇到 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]$