由于Python的版本过多,且不同版本之间差异性较大。同时又因系统底层需要调用当前版本Python,所以不能随意变更当前系统Python版本。因此,在多版本共存的情况下,Python多环境管理工具非常重要,常见Python多环境管理工具有Pyenv和Virtualenv。
Pyenv对Python的版本进行管理,实现不通版本间的切换和使用;
Virtualenv通过创建虚拟环境,实现与系统环境以及其他Python环境的隔离。
pyenv是一个Python版本管理工具,可方便地切换全局Python版本,安装多个不通的Python版本,设置独立的某个文件夹或工程目录特意的Python版本,同时创建Python虚拟环境。
注意:该工具不支持Windows。
提示:执行命令pyenv versions可查看系统当前安装的Python版本。
python优先级:shell > local > global
pyenv 会从当前目录开始向上逐级查找.python-version文件,直到根目录为止。若找不到,就用global版本。
[root@localhost ~]# yum -y install git #安装git工具[root@localhost ~]# yum -y install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel #安装相关环境基础包[root@localhost ~]# git clone https://github.com/pyenv/pyenv.git ~/.pyenv#clone pyenv至家目录[root@localhost ~]# echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile[root@localhost ~]# echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile[root@localhost ~]# echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile#修改环境变量[root@localhost ~]# source ~/.bash_profile #重启当前Shell[root@localhost ~]# pyenv versions #查看版本

[root@localhost ~]# yum -y install git #安装git工具[root@localhost ~]# yum -y install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel #安装相关环境基础包[root@localhost ~]# curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash[root@localhost ~]# pyenv versions #查看版本

提示:手动安装和自动挡安装任选其一即可。
自动安装可能出现环境变量未添加的情况,可参考手动安装进行添加。
[root@localhost ~]# pyenv update #pyenv升级[root@localhost ~]# rm -rf $(pyenv root) #卸载[root@localhost ~]# vi ~/.bash_profile #删除以下条目export PATH="~/.pyenv/bin:$PATH" #删除eval "$(pyenv init -)" #删除eval "$(pyenv virtualenv-init -)" #删除[root@localhost ~]# pyenv install -list #查看可安装的版本列表[root@localhost ~]# pyenv install 3.6.5 #安装指定版本的Python[root@localhost tmp]# pyenv local 2.7.15

#切换当前目录的Python版本,通过将版本号写入当前目录下的.python-version文件的方式。通过这种方式设置的 Python版本优先级较global高。
[root@localhost tmp]# pyenv global 3.6.5
#设置全局的Python版本,通过将版本号写入~/.pyenv/version文件的方式。
命令 | 说明 |
pyenv version | 显示当前Python的版本和来源。 |
pyenv versions | 列出当前环境的所有可用Python版本。 |
pyenv install -l | 列出所有可以安装的Python版本。 |
pyenv install -v | 安装Python,-v 显示编译过程。 |
pyenv shell | 查看或列出、设置Shell环境下的的Python版本, 设置当前shell session的Python版本,它的优先级高于global和local。 |
pyenv shell –unset | 取消shell版本设置。 |
pyenv global | 查看或列出、设置全局环境下的的Python版本, 设置全局Python版本替换系统自带版本,可能会引起某些配置失效 (如yum命令),不建议使用!!!设置后恢复系统版本:pyenv global system。 |
pyenv local | 查看或列出、设置当前环境下的的Python版本, 设置当前用户的可用的本地Python版本,它的优先级高于全局Python版本。 |
pyenv local –unset | 取消本地版本设置。 |
pyenv uninstall | 卸载特定Python版本。 |
pyenv which | 列出command的全路径。 |
pyenv whence | 列出包含command的所有Python版本。 |
pyenv commands | 列出所有pyenv可用命令行。 |
pyenv rehash | 重新加载pyenv的shims路径,即刷新数据库, 安装完Python版本后下需要执行该命令。 |
参考链接:https://github.com/pyenv/pyenv#installation
Virtualenv试试一个用来为一个应用创建一套“隔离”的Python运行环境,使得每个应用拥有一套“独立”的Python运行环境。Virtualenv通过创建一个虚拟化的python运行环境,将我们所需的依赖安装进去的,不同项目之间相互不干扰。特点:
[root@localhost ~]# pip install virtualenv
提示:pip的安装参考《001.Pip简介及使用》,也可使用以下方式安装:
[root@localhost ~]# yum -y install python-virtualenv[root@localhost ~]# mkdir /study #创建工作目录[root@localhost ~]# cd /study/ #进入工作目录[root@localhost study]# virtualenv venv #为此工程创建一个虚拟环境,venv为虚拟环境目录名,目录名自定义
提示:
virtualenv venv将会在当前的目录中创建一个文件夹,包含了Python可执行文件,以及pip库的一份拷贝,这样就能安装其他包了。虚拟环境的名字(此例中是 venv )可以是任意的,若省略名字将会把文件均放在当前目录。
在任何你运行命令的目录中,这会创建Python的拷贝,并将之放在叫做 venv 的文件中。
[root@localhost study]# virtualenv -p /usr/bin/python2.7 study01 #-p参数指定Python解释器程序路径[root@localhost study]# source study01/bin/activate #激活虚拟环境(study01)[root@localhost study]# deactivate #退出当前系统环境
# virtualenv [OPTIONS] DEST_DIR 选项:--version #显示当前版本号。 -h, –help #显示帮助信息。 -v, –verbose #显示详细信息。 -q, –quiet #不显示详细信息。 -p PYTHON_EXE, –python=PYTHON_EXE#指定所用的python解析器的版本,比如–python=python2.5就使用2.5版本的解析器创建新的隔离环境。#默认使用的是当前系统安装(/usr/bin/python)的python解析器 --clear #清空非root用户的安装,并重头开始创建隔离环境。 --no-site-packages #令隔离环境不能访问系统全局的site-packages目录。 --system-site-packages #令隔离环境可以访问系统全局的site-packages目录。 --unzip-setuptools #安装时解压Setuptools或Distribute --relocatable#重定位某个已存在的隔离环境。使用该选项将修正脚本并令所有.pth文件使用相当路径。 --distribute#使用Distribute代替Setuptools,也可设置环境变量VIRTUALENV_DISTRIBUTE达到同样效要。 --extra-search-dir=SEARCH_DIRS#用于查找setuptools/distribute/pip发布包的目录。可以添加任意数量的–extra-search-dir路径。 --never-download#禁止从网上下载任何数据。此时,如果在本地搜索发布包失败,virtualenv就会报错。 --prompt==PROMPT #定义隔离环境的命令行前缀。
update-alternatives是用来维护系统命令的符号链接,以决定系统默认使用什么命令,可以设置系统默认加载的首选程序。即用于处理linux系统中软件版本的切换。
各个linux发行版中均提供了该命令,可免安装直接使用,命令参数略有差异,本实验以CentOS7.8为基础。
[root@localhost ~]# update-alternatives --helpCommands: --install <link> <name> <path> <priority>[--slave <link> <name> <path>] ... #在系统中加入一组候选项 --remove <name> <path> #从 <name> 替换组中去除 <path> 项 --remove-all <name> #从替换系统中删除整个 <name> 替换组 --auto <name> #将 <name> 的主链接切换到自动模式 --display <name> #显示关于 <name> 替换组的信息 --query <name> #机器可读版的 --display <name> --list <name> #列出 <name> 替换组中所有的可用候选项项 --get-selections #列出主要候选项名称以及它们的状态 --set-selections #从标准输入中读入候选项的状态 --config <name> #列出 <name> 替换组中的可选项,并就使用其中哪一个,征询用户的意见 --set <name> <path> #将 <path> 设置为 <name> 的候选项 --all #对所有可选项一一调用 --config 命令<link>:是指向 /etc/alternatives/<name> 的符号链接>,如/usr/bin/python;<name>:是该链接替换组的主控名,如python;<path>:是替换项目标文件的真实位置/usr/local/python3/bin/python3.9;<priority>:是一个整数,在自动模式下,这个数字越高的选项,其优先级也就越高。Options: --altdir <directory> #指定不同的可选项目录 --admindir <directory> #指定不同的管理目录 --log <file> #设置log文件 --force #就算没有通过自检,也强制执行操作 --skip-auto #在自动模式中跳过设置正确候选项的提示,只与--config 有关 --verbose #详尽的操作进行信息,更多的输出 --quiet #安静模式,输出尽可能少的信息 --help #显示本帮助信息 --version #显示版本信息.
注意:alternatives是update-alternatives的软链接,后续直接使用alternatives。
display:display选项用来显示一个命令链接的所有可选命令,即查看一个命令链接组的所有信息,包括链接的模式(自动还是手动)、链接priority值、所有可 用的链接命令等等。
install:install选项的功能就是增加一组新的系统命令链接符。
使用语法为:update-alternatives --install <link> <name> <path> <priority> [--slave link name path]。其中link为系统中功能相同软件的公共链接目录,比如/usr/bin/java(需绝对目录); name为命令链接符名称,如java;path为你所要使用新命令、新软件的所在目录;priority为优先级,当命令链接已存在时,需高于当前值,因为当alternative为自动模式时,系统默认启用priority高的链接;–slave为从alternative。
config:config选项用来显示和修改实际指向的候选命令,为在现有的命令链接选择一个作为系统默认。
remove:remove选项的功能是删除一个命令的link值,其附带的slave也将一起删除。
使用语法为:update-alternatives --remove name path。其中name与path与install中的一致,如果所删除的链接组中还有其他链接的话,系统将会自动从其他中选择一个priority高的链接作为默认为链接。
比如:update-alternatives –remove java /usr/lib/jvm/jre1.6.0_20/bin/java
[root@localhost ~]# alternatives --install /usr/bin/python python \/usr/local/python3/bin/python3.9 50[root@localhost ~]# alternatives --install /usr/bin/python python \/usr/bin/python2.7 30[root@localhost ~]# alternatives --display python #查看Python版本python - status is auto. #自动模式,选择权限较高的 link currently points to /usr/local/python3/bin/python3.9/usr/local/python3/bin/python3.9 - priority 50/usr/bin/python2.7 - priority 30Current `best' version is /usr/local/python3/bin/python3.9.[root@localhost ~]# ll /usr/bin/pythonlrwxrwxrwx 1 root root 24 Nov 5 16:03 /usr/bin/python -> /etc/alternatives/python[root@localhost ~]# ll /etc/alternatives/pythonlrwxrwxrwx 1 root root 32 Nov 5 16:03 /etc/alternatives/python -> /usr/local/python3/bin/python3.9
[root@localhost ~]# alternatives --config python #配置版本There are 2 programs which provide 'python'. Selection Command-----------------------------------------------*+ 1 /usr/local/python3/bin/python3.9 2 /usr/bin/python2.7Enter to keep the current selection[+], or type selection number: 2 #选择版本[root@localhost ~]# alternatives --display python #查看当前版本python - status is manual. link currently points to /usr/bin/python2.7/usr/local/python3/bin/python3.9 - priority 50/usr/bin/python2.7 - priority 30Current `best' version is /usr/local/python3/bin/python3.9.[root@localhost ~]# ll /usr/bin/pythonlrwxrwxrwx 1 root root 24 Nov 5 16:11 /usr/bin/python -> /etc/alternatives/python[root@localhost ~]# ll /etc/alternatives/pythonlrwxrwxrwx 1 root root 18 Nov 5 16:11 /etc/alternatives/python -> /usr/bin/python2.7[root@localhost ~]# alternatives --auto python #自动选择权限最高的版本
作者:木二
出处:http://www.cnblogs.com/itzgr/
关于作者:云计算、虚拟化,Linux,多多交流!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接!如有其他问题,可邮件(xhy@itzgr.com)咨询。