在学习和利用python开发的很多情况下,需要多版本的Python并存。此时需要在系统中安装多个Python,但又不能影响系统自带的 Python。pyenv 就是这样一个 Python 版本管理器。
一、 pyenv介绍
项目地址:https://github.com/pyenv/pyenv
简单的说,pyenv 可以根据需求使用户在系统里安装和管理多个 Python 版本:
- 配置当前用户的python的版本
- 配置当前shell的python版本
- 配置某个项目(目录及子目录)的python版本
配置多个虚拟环境
pyenv的工作原理:pyenv是利用系统环境变量PATH的优先级,劫持python的命令到pyenv上,根据用户所在的环境或目录,使用不同版本的python。
二、pyenv安装
系统环境:centos 7
- 安装git
yum -y install git
- 安装python所依赖的库文件
yum -y install gcc make patch openssl-devel sqlite-devel readline-devel gdbm-devel zlib-devel bzip2-devel
- 安装pyenv
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
- 配置环境变量
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的使用
-
查看pyenv支持的python版本,同时也是检查pyenv有没有安装成功
pyenv install --list
-
使用pyenv安装python
pyenv -v install 3.6.6
由于这个命令从国外网站下载python的过程比较慢。我们可以在.pyenv/目录创建一个cache目录,并将事先准备好的对应版本python包上传至该目录。
-
查看pyenv可检测到的版本,*标示的为当前状态下的激活版本
[root@localhost ~]# pyenv versions
* system (set by /root/.pyenv/version)
3.6.6 -
切换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) -
创建虚拟环境
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 -
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源
-
有时候我们使用
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/
-
查看当前环境安装包名字
pip freeze
pip listpip
命令-r
参数安装requirement.txt
文件上的所有包pip freeze > ./requirement.txt
pip isntall -r ./requirement.txt