这篇主要是解决python多个版本链接的问题。

一、看一个小知识点

update-alternatives 是符号链接管理工具。用于分组管理命令的链接和优先级。

update-alternatives 以链接组进行管理,每一个链接组(link group)都有两种不同的模式:自动模式和手动模式,任一给定时刻一个组都是而且只能是其中的一种模式。

如果一个组处于自动模式,当包被安装或删除时,备选方案系统会自己决定是否和如何来更新相应链接(links)。

如果处于手动模式,备选方案系统会保留原先管理员所做的选择并且避免改变链接(除非发生 broken)。

当第一次被安装到系统时链接组被分配为自动模式;如果之后系统管理员对模式的设置做出更改,这个组会被自动转换为手动模式。

--display name

显示链接组的信息。信息包括链接组的模式(自动或手动);链接的指针(链到了那一个文件);优先级是多少;当前最优版本等。

--install link name path priority [--slave slink sname spath] ...

其中 link 为系统中功能相同软件的公共链接目录,比如 /usr/bin/java(需绝对目录);

name 为命令链接符名称,如 java;

path 为你所要使用新命令、新软件的所在目录;

priority 为优先级,当命令链接已存在时,需高于当前值,因为当 alternative 为自动模式时,系统默认启用 priority 高的链接;

--slave 为从 alternative。

例如:

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk8/bin/java 300

install 默认都为 auto 模式,因为大多数情况下 update-alternatives 命令都被postinst (configure) or prerm (install)调用的,如果将其更改成手动的话安装脚本将不会更新它了。

--config name

当使用 --config 选项时,update-alternatives 会列出所有链接组的主链接名,当前被选择的组会以号标出。可以在提示下对链接指向做出改变,不过这会将模式变为手动。如果想恢复自动模式,你可以使用 --auto 选项,或者 --config 重新选择标为自动的组。

例如:

$ sudo update-alternatives --config editor
There are 4 choices for the alternative editor (providing /usr/bin/editor).
Selection    Path                Priority   Status
------------------------------------------------------------
 0            /bin/nano            40        auto mode
1            /bin/ed             -100       manual mode
2            /bin/nano            40        manual mode
3            /usr/bin/vim.basic   30        manual mode
4            /usr/bin/vim.tiny    10        manual mode
Press enter to keep the current choice[*],or type selection number: 

--auto name

重新使 name 链接组为自动模式。

--remove name path

删除 name 链接组里的 path 对应的符号链接


二、版本切换方法

1、修改别名

首先先来看一下我们的默认Python版本

$ python --version
Python 2.7.6

然后我们修改一下别名

$ alias python='/usr/bin/python3'
$ python --version
Python 3.4.3  # 版本已经改变

/usr/bin/python3这个路径是怎么找到的呢?

一般来说,软件的二进制文件都可以在/usr/bin或/usr/local/bin(这个优先级高一点)找到。当然如果你是Debian系的Linux,可以这么找(前提是你已经安装了python3):

$ dpkg -L python3

上面的别名修改只是暂时性的,重开一个窗口后配置就不见了。如果要使每个窗口都使用这个别名,可以编辑~/.bashrc(如果你是别的shell的话,就不是这个文件,如zsh是~/.zshrc),把alias配置写入文件。

修改别名优点是足够简单,但是切换不灵活。

2、链接文件

在/usr/bin中建立一个链接文件指向python3。

$ ln -s python /usr/bin/python3
$ python --version
Python 3.4.3

跟修改别名一样,也是修改不够灵活。

3、采用update-alternatives 切换版本

首先看一下update-alternatives的帮助信息:

$ update-alternatives --help
用法:update-alternatives [<选项> ...] <命令>

命令:
  --install <链接> <名称> <路径> <优先级>
    [--slave <链接> <名称> <路径>] ...
                           在系统中加入一组候选项。
  --remove <名称> <路径>   从 <名称> 替换组中去除 <路径> 项。
  --remove-all <名称>      从替换系统中删除 <名称> 替换组。
  --auto <名称>            将 <名称> 的主链接切换到自动模式。
  --display <名称>         显示关于 <名称> 替换组的信息。
  --query <名称>           机器可读版的 --display <名称>.
  --list <名称>            列出 <名称> 替换组中所有的可用候选项。
  --get-selections         列出主要候选项名称以及它们的状态。
  --set-selections         从标准输入中读入候选项的状态。
  --config <名称>          列出 <名称> 替换组中的可选项,并就使用其中
                           哪一个,征询用户的意见。
  --set <名称> <路径>      将 <路径> 设置为 <名称> 的候选项。
  --all                    对所有可选项一一调用 --config 命令。

<链接> 是指向 /etc/alternatives/<名称> 的符号链接。
    (如 /usr/bin/pager)
<名称> 是该链接替换组的主控名。
    (如 pager)
<路径> 是候选项目标文件的位置。
    (如 /usr/bin/less)
<优先级> 是一个整数,在自动模式下,这个数字越高的选项,其优先级也就越高。

选项:
  --altdir <目录>          改变候选项目录。
  --admindir <目录>        设置 statoverride 文件的目录。
  --log <文件>             改变日志文件。
  --force                  就算没有通过自检,也强制执行操作。
  --skip-auto              在自动模式中跳过设置正确候选项的提示
                           (只与 --config 有关)
  --verbose                启用详细输出。
  --quiet                  安静模式,输出尽可能少的信息。不显示输出信息。
  --help                   显示本帮助信息。
  --version                显示版本信息。

我们仅需要了解3个参数就行了

  • --install <链接> <名称> <路径> <优先级>:建立一组候选项
  • --config <名称>:配置 <名称>组中的可选项,并选择使用其中哪一个
  • --remove <名称> <路径>:从 <名称> 中去掉 <路径>选项

首先我们先看一下有没有关于Python的可选项:

$ update-alternatives --display python
update-alternatives: 错误: 无 python 的候选项

那首先先建立python的组,并添加Python2和python3的可选项

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2 # 添加Python2可选项,优先级为2
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.4 1 #添加python3可选项,优先级为1

注意,这里的/usr/bin/python链接文件,两个可选项必须是一样的,这样这个链接文件才可以选择两个不同的可选项去链接。

这时如果我们查看/usr/bin/python这个文件时,会发现它已经链接到了/etc/alternatives/python。

lrwxrwxrwx 1 root root        24  6月 19 18:39 python -> /etc/alternatives/python

然后我们再看一下版本

$ python --version
Python 2.7.6

为什么还是Python2,看一下配置

$ sudo update-alternatives --config python
有 2 个候选项可用于替换 python (提供 /usr/bin/python)。

  选择       路径              优先级  状态
------------------------------------------------------------
* 0            /usr/bin/python2.7   2         自动模式
  1            /usr/bin/python2.7   2         手动模式
  2            /usr/bin/python3.4   1         手动模式
要维持当前值[*]请按回车键,或者键入选择的编号:

原来是因为默认选中了自动模式,而Python2的优先级高于python3,这时候只要键入2,就可以使用python3了。

如果你想要删除某个可选项的话:

$ sudo update-alternatives --remove python /usr/bin/python2.7

update-alternatives只适用于Debian系Liunx。

4、virtualenvwrapper 切换版本

virtualenvwrapper是管理Python虚拟环境的工具,可以很方便的为不同的项目建立独立的环境,每个项目都可以安装自己的依赖,同时也支持在不同的虚拟环境中存在不同版本的Python。

首先安装virtualenvwrapper,可以选择apt安装或者pip安装

apt安装

$ sudo apt-get install virtualenvwrapper

pip安装

$ sudo pip install virtualenvwrapper

当你需要使用Python2开发项目时,建立一个Python2的虚拟环境:

$ mkvirtualenv -p /usr/bin/python2 env27

当你需要python3开发时:

$ mkvirtualenv -p /usr/bin/python3.4 env34

然后可以随时切换不同的虚拟环境:

$ workon env27  # 进入Python2环境
$ workon env34  # 进入python3环境

更爽的是,你可以在进入虚拟环境的同时切换到项目目录,只需要编辑$VIRTUAL_ENV/bin/postactivate这个文件即可:

$ vim $VIRTUAL_ENV/bin/postactivate  #前提是已经进入对应的虚拟环境

在文件中添加切换目录的命令:

cd  /path/to/your/project

pip调用python版本不对的话,可以通过一下方法快速解决:
step1:which pip命令,得到pip的路径为/usr/local/bin/pip。
step2:将/usr/local/bin/pip文件首行 #!/usr/bin/python3 改为 #!/usr/bin/python 这样即可将pip由对python3的绑定重新变成python。

参考链接:

http://blog.csdn.net/justdoithai/article/details/70310095

https://hacpai.com/article/1471921285409?p=1&m=0

https://segmentfault.com/q/1010000003713912

ubuntu上设置默认python命令是执行python3还是python2的更多相关文章

  1. iOS推送通知优先级

    我已设置推送通知并正常工作,但是,有时我会遇到终端设备上的延迟交付.有没有办法我可以将推送的“优先级”键设置为10,以便立即发送推送?

  2. ios – 何时使用Semaphore而不是Dispatch Group?

    我会假设我知道如何使用DispatchGroup,为了解问题,我尝试过:结果–预期–是:为了使用信号量,我实现了:并在viewDidLoad方法中调用它.结果是:从概念上讲,dispachGroup和Semaphore都有同样的目的.老实说,我不熟悉:什么时候使用信号量,尤其是在与dispachGroup合作时–可能–处理问题.我错过了什么部分?

  3. 如何使用Xcode的自动布局调整视图大小

    解决方法在写这个问题时,我意识到了诀窍是什么:在NSPopUpButton的大小检查器中,我不得不降低内容拥抱优先级.显然,这可以控制视图“拥抱”其内容的紧密程度.因此,当拥抱优先级高于调整大小优先级时,视图将不希望增加其大小,因为这意味着其边界与其内容之间具有更多的空白空间.然后在我的特殊情况下,我也可以将两个NSPopUpButtons固定为具有相同的宽度和vo:popUpButtons将完美地调整大小,同时保持间距不变.

  4. ios – 默认的自动布局内容拥抱和内容压缩阻抗优先级值是什么?

    我正在尝试调试自动布局问题,并且知道内容拥抱和内容压缩阻力优先级的默认值将有所帮助.这些是什么?它们是否特定于特定组件?我可以使用常量来引用它们吗?

  5. ios – 为自定义创建的串行异步队列设置优先级

    如何使用GCD为自定义创建的串行异步队列设置高优先级?如果是这样,什么是替代解决方案?解决方法您的队列仍然是串行的.它只会在高优先级全局并发后台队列的一个插槽中一次执行一项任务.一旦创建,串行队列就不能以任何方式“并发”.同样,如果您创建并发队列并将其设置为以串行队列为目标,则它实际上变为串行.这一切都在manpage中有所涉及.

  6. 如何在Xcode 7上为项目选择python 3.5.1可执行文件?

    我想在Xcode中设置一个python3项目,但是在我要求为该方案选择可执行文件的步骤中我失败了.请参阅PythoninXcode4+?

  7. iOS 9中UILabel中的多行文本

    我正在开发iOS项目但是当我更新到iOS9时,我在UILabels中遇到了多线问题.我正在使用Autolayout.有谁知道如何在iOS9中做到这一点?如果是这样,那么问题可能是标签内容压缩阻力优先级太低,尝试将其设置为required或1000.内容压缩阻力告诉视图引擎您的标签可以缩小的优先级.将其设置为必需会强制它不缩小.在InterfaceBuilder中,只需选择标签,点击SizeInspector(小标尺),然后将其更改为1000.或者,在代码中,等价物将是:

  8. ios – AutoLayout修改约束

    我发现Autolayout有点困难,所以任何帮助都会非常感激解决方法嗨,你可以做2套约束:>1以优先级高管理您的四视图>1以优先级低管理全屏在点击按钮时调用的方法中,将优先级设置为全屏约束,将优先级设置为四视图约束.

  9. Swift 运算符重载

    但是现在还有另外一个Swift的特性,你应该知道并且会爱上它,它就是运算符重载。例如:我们在SwiftSpriteKitutilitylibrary代码中使用运算符重载去讲多个CGPoints对象相加,例如下面代码:1234letpt1=CGPointletpt2=CGPointletpt3=pt1+pt2letpt4=pt3*100方便吧?当一个人查看你的代码,他们希望操作符的默认行为,这时候运算符重载会使他们迷惑。幸运的是Swift让你能够定义属于你自己的自定义的运算符。

  10. Swift学习一:自定义运算符 operator

    自定义运算符仅能包含这些字符:运算符位置:运算符其他配置范例

随机推荐

  1. crontab发送一个月份的电子邮件

    ubuntu14.04邮件服务器:Postfixroot收到来自crontab的十几封电子邮件.这些邮件包含PHP警告.>我已经解决了这些警告的原因.>我已修复每个cronjobs不发送电子邮件(输出发送到>/dev/null2>&1)>我删除了之前的所有电子邮件/var/mail/root/var/spool/mail/root但我仍然每小时收到十几封电子邮件.这些电子邮件来自cronjobs,

  2. 模拟两个ubuntu服务器计算机之间的慢速连接

    我想模拟以下场景:假设我有4台ubuntu服务器机器A,B,C和D.我想在机器A和机器C之间减少20%的网络带宽,在A和B之间减少10%.使用网络模拟/限制工具来做到这一点?

  3. ubuntu-12.04 – 如何在ubuntu 12.04中卸载从源安装的redis?

    我从源代码在Ubuntu12.04上安装了redis-server.但在某些时候它无法完全安装,最后一次makeinstallcmd失败.然后我刚刚通过apt包安装.现在我很困惑哪个安装正在运行哪个conf文件?实际上我想卸载/删除通过源安装的所有内容,只是想安装一个包.转到源代码树并尝试以下命令:如果这不起作用,您可以列出软件自行安装所需的步骤:

  4. ubuntu – “apt-get source”无法找到包但“apt-get install”和“apt-get cache”可以找到它

    我正在尝试下载软件包的源代码,但是当我运行时它无法找到.但是当我运行apt-cache搜索squid3时,它会找到它.它也适用于apt-getinstallsquid3.我使用的是Ubuntu11.04服务器,这是我的/etc/apt/sources.list我已经多次更新了.我尝试了很多不同的debs,并没有发现任何其他地方的错误.这里的问题是你的二进制包(deb)与你的源包(deb-src)不

  5. ubuntu – 有没有办法检测nginx何时完成正常关闭?

    &&touchrestarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.有没有好办法呢?这样的事情怎么样?因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1;/etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.

  6. ubuntu – 如何将所有外发电子邮件从postfix重定向到单个地址进行测试

    我正在为基于Web的应用程序设置测试服务器,该应用程序发送一些电子邮件通知.有时候测试是使用真实的客户数据进行的,因此我需要保证服务器在我们测试时无法向真实客户发送电子邮件.我想要的是配置postfix,以便它接收任何外发电子邮件并将其重定向到一个电子邮件地址,而不是传递到真正的目的地.我正在运行ubuntu服务器9.10.先感谢您设置本地用户以接收所有被困邮件:你需要在main.cf中添加:然后

  7. ubuntu – vagrant无法连接到虚拟框

    当我使用基本的Vagrantfile,只配置了两条线:我看到我的虚拟框打开,但是我的流氓日志多次显示此行直到超时:然后,超时后的一段时间,虚拟框框终于要求我登录,但是太久了!所以我用流氓/流氓记录.然后在我的物理机器上,如果我“流氓ssh”.没有事情发生,直到:怎么了?

  8. ubuntu – Nginx – 转发HTTP AUTH – 用户?

    我和Nginx和Jenkins有些麻烦.我尝试使用Nginx作为Jenkins实例的反向代理,使用HTTP基本身份验证.它到目前为止工作,但我不知道如何传递带有AUTH用户名的标头?}尝试将此指令添加到您的位置块

  9. Debian / Ubuntu – 删除后如何恢复/ var / cache / apt结构?

    我在ubuntu服务器上的空间不足,所以我做了这个命令以节省空间但是现在在尝试使用apt时,我会收到以下错误:等等显然我删除了一些目录结构.有没有办法做apt-getrebuild-var-tree或类似的?

  10. 检查ubuntu上安装的rubygems版本?

    如何查看我的ubuntu盒子上安装的rubygems版本?只是一个想法,列出已安装的软件包和grep为ruby或宝石或其他:)dpkg–get-selections

返回
顶部