系统环境:ubuntu14.04.5 LTS
,系统默认的python
版本为2.7.4/3.4.3
。
但是实际工作中,某些通过pip
安装的开发包需要不低于某个版本的python
才能正常工作,比如ansible-2.4.2.0
,明确只支持python-3.5
以上的版本。在低版本的python
上,无法正常运行。
而如果我们贸然更新系统python
版本的话,会导致系统异常。因此我们借助pyenv
实现基于用户的python
版本定制。
安装pyenv
:
1 2 3 4 5 6 7 8 9 |
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc $ echo 'eval "$(pyenv init -)"' >> ~/.bashrc $ exec $SHELL -l |
查看可以安装的python
版本:
1 |
$ pyenv install --list |
这里以安装python-3.6.4
为例,首先安装依赖:
1 |
$ sudo apt-get install -y make build-essential |
安装python
:
1 2 3 4 |
# 要求开启Python动态库的支持(默认是全部静态编译),否则在安装某些插件的时候会出现无法正常链接的情况,比如 mod_wsgi $ export PYTHON_CONFIGURE_OPTS="--enable-shared" $ pyenv install 3.6.4 -vvv |
该命令会从github
上下载python
的源代码,并解压到/tmp
目录下,然后在/tmp
中执行编译工作。若依赖包没有安装,则会出现编译错误,需要在安装依赖包之后重新执行该命令。
安装完成之后,需要使用如下命令对数据库进行更新:
1 |
$ pyenv rehash |
查看当前已经安装的python
版本
1 2 3 |
$ pyenv versions * system (set by /home/xxx/.pyenv/version) 3.6.4 |
其中星号代表是当前系统正在使用的python
版本是系统自带的。
设置全局的python
版本
1 2 3 4 5 |
$ pyenv global 3.6.4 $ pyenv versions system * 3.6.4 (set by /home/xxx/.pyenv/version) |
从上面,我们可以看出来当前的python
版本已经变为了3.6.4
。也可以使用pyenv local
或pyenv shell
临时改变python
的版本。
如果需要还原设定的python
版本为系统自带的版本,则执行如下命令:
1 |
$ pyenv global system |
确认python
版本
1 2 3 4 |
$ python Python 3.6.4 (default, Jan 9 2018, 11:21:57) [GCC 4.8.4] on linux Type "help", "copyright", "credits" or "license" for more information. |
上面的操作会导致在当前用户下,执行python
或者python3
命令的时候都会被定向到python-3.6.4
,如果只想执行python3
命令的时候被定向到python-3.6.4
,则可以直接删除python
这个链接:
1 2 3 |
# 注意,这个链接删除后,可能导致ros indigo的初始化异常,因此,这部分的改动要慎重 $ rm -rf ~/.pyenv/versions/3.6.4/bin/python |
安装pip
:
1 2 3 4 5 6 7 |
$ wget https://bootstrap.pypa.io/get-pip.py $ python3 get-pip.py $ rm -rf get-pip.py $ pip3 install --upgrade pip |
安装完成之后,需要使用如下命令对数据库进行更新:
1 |
$ pyenv rehash |
注意事项:
- 输入
python
即可使用新版的python
- 系统自带的脚本会以
/usr/bin/python
的方式直接调用老版本的python
,因而不会对系统脚本产生影响 - 使用
pip
安装第三方模块时会安装到~/.pyenv/versions/3.6.4
下,不会和系统模块发生冲突 - 使用
pip
安装模块后,可能需要执行pyenv rehash
更新数据库