如何更改默认Python版本?
我在我的Mac上安装了Python 3.2。然后我运行了 /Applications/Python 3.2/Update Shell Profile.command
,但让我感到困惑的是,当我在终端输入 python -V
时,它显示的是 Python 2.6.1
,这不是我想要的版本。
我该怎么才能更改默认的Python版本呢?
22 个回答
这是个老问题,不过还有另外一种方法:
virtualenv --python=python3.5 .venv
source .venv/bin/activate
检查一下 Python 3 的安装位置
$ which python3
/usr/local/bin/python3
在 bash_profile 文件中写一个别名
vi ~/.bash_profile
alias python='/usr/local/bin/python3'
重新加载 bash_profile 文件
source ~/.bash_profile
确认一下 python 命令是否有效
$ python --version
Python 3.6.5
[更新于2021年]
(无论你是在Mac、Linux还是Windows上:)
如果你对如何启动最新版本的Python感到困惑,在大多数平台上,使用python3
命令可以让你保持python2
的安装不变(这是出于兼容性的考虑);因此,你可以通过python3
命令来启动Python 3。
历史背景...
一般来说,大多数脚本会明确调用python2或python3。这是因为需要向后兼容。
虽然从技术上讲,Python并不保证小版本之间的向后兼容性,但Python 3确实打破了向后兼容性。当时,调用'python
'的程序是期望使用python2(那时的主要版本)。一些非常老的系统可能有程序和脚本期望python
等于python2,改变这一点会导致这些程序和脚本无法正常工作。
在这个答案写的时候,提问者不应该改变这一点,以保持对旧脚本的兼容性。
大约在2021年...
如今,在Python 2转向Python 3多年后,大多数软件明确提到python2或python3(至少在Linux上)。例如,它们可能会调用#!/usr/bin/env python2
或#!/usr/bin/env python3
。例如,这个python-is-python3包使得python命令可以设置为用户默认值,但这实际上取决于操作系统。
关于发行版如何处理python
命令的建议在2011年写成了PEP 394 -- Unix类系统上的“python”命令,最后一次更新是在2019年6月。
基本上,如果你在写一个库,你应该指定你可以使用的Python版本(2或3,或者在特定情况下更细致)。否则,作为最终用户,你可以自由地为个人使用重命名这个命令(尽管你的操作系统或发行版可能不太容易做到这一点)。
Shell别名:
不过,你可以在你的shell中创建一个自定义别名。具体怎么做取决于你使用的shell,但你可以试试alias py=python3
,并把它放在你的shell启动文件中(如.bashrc、.zshrc等)。这只会在你的本地计算机上有效(这也是应该的),而且相比直接输入命令,这样做有点多余(除非你经常调用这个命令)。
困惑的用户不应该尝试创建别名或虚拟环境等,使得不过现在这样是可以接受的,但PEP 394建议用户使用virtualenv。python
执行python3
;这并不是一个好做法。
不同的3.*版本或2.*版本:
在极不可能的情况下,如果有人遇到这个问题,发现自己有两个python3版本,比如3.1和3.2,并且你困惑自己怎么会安装了两个版本的Python,这可能是因为你进行了手动安装。你可以使用操作系统的标准包/程序安装/卸载/管理工具来帮助追踪这些问题,或许(除非你在做开发工作,意外受到小版本之间少数不兼容变化的影响)删除旧版本(如果你进行了手动安装,可以使用make uninstall
)。如果你需要两个版本,那么重新配置你的$PATH
变量,使得你想要的“默认”版本在前面;或者如果你使用的是大多数Linux发行版,你可以使用命令sudo update-alternatives
。确保你运行的任何需要访问旧版本的程序可以通过它们的调用环境或shell正确调用(通过在该环境中设置PATH
变量)。
关于$PATH的一点说明
附带说明:关于PATH的详细说明:程序选择的常用方式是通过PATH
环境变量(在Linux和Mac上可以用echo $PATH
查看)。你总是可以通过完整路径运行程序,例如/usr/bin/ some args
,或者cd /usr/bin
然后./ some args
(用我上面提到的'echo'程序替换空白),但如果没有PATH
环境变量,输入 some args
是没有意义的,因为它声明了我们可以隐式搜索并执行的文件目录(如果/usr/bin
不在PATH
中,它会显示: command not found
)。第一个匹配的命令会在第一个目录中执行(在Linux和Mac上可以用which
命令查看这个子路径)。通常它是(例如在Linux上,但在Mac上也类似)像/usr/bin/python
这样的路径,它是指向其他符号链接的符号链接,最终指向某个版本,例如:
% echo $PATH
/usr/sbin:/usr/local/bin:/usr/sbin:usr/local/bin:/usr/bin:/bin
% which python
/usr/bin/python
% which python2
/usr/bin/python2
% ls -l /usr/bin/python
lrwxrwxrwx 1 root root 7 Mar 4 2019 /usr/bin/python -> python2*
% ls -l /usr/bin/python2
lrwxrwxrwx 1 root root 9 Mar 4 2019 /usr/bin/python2 -> python2.7*
% ls -l /usr/bin/python2.7
-rwxr-xr-x 1 root root 3689352 Oct 10 2019 /usr/bin/python2.7*
% which python3
/usr/bin/python3
% ls -l /usr/bin/python3
lrwxrwxrwx 1 root root 9 Mar 26 2019 /usr/bin/python3 -> python3.7*
% ls -l /usr/bin/python3.7
-rwxr-xr-x 2 root root 4877888 Apr 2 2019 /usr/bin/python3.7*
% ls -l /usr/bin/python*
lrwxrwxrwx 1 root root 7 Mar 4 2019 /usr/bin/python -> python2*
lrwxrwxrwx 1 root root 9 Mar 4 2019 /usr/bin/python2 -> python2.7*
-rwxr-xr-x 1 root root 3689352 Oct 10 2019 /usr/bin/python2.7*
lrwxrwxrwx 1 root root 9 Mar 26 2019 /usr/bin/python3 -> python3.7*
-rwxr-xr-x 2 root root 4877888 Apr 2 2019 /usr/bin/python3.7*
lrwxrwxrwx 1 root root 33 Apr 2 2019 /usr/bin/python3.7-config -> x86_64-linux-gnu-python3.7-config*
-rwxr-xr-x 2 root root 4877888 Apr 2 2019 /usr/bin/python3.7m*
lrwxrwxrwx 1 root root 34 Apr 2 2019 /usr/bin/python3.7m-config -> x86_64-linux-gnu-python3.7m-config*
lrwxrwxrwx 1 root root 16 Mar 26 2019 /usr/bin/python3-config -> python3.7-config*
lrwxrwxrwx 1 root root 10 Mar 26 2019 /usr/bin/python3m -> python3.7m*
lrwxrwxrwx 1 root root 17 Mar 26 2019 /usr/bin/python3m-config -> python3.7m-config*
附带说明2:(在更少见的情况下,如果一个Python程序通过subprocess
模块调用一个子程序,指定要运行哪个程序,可以通过sys.path
从sys模块或在父进程中设置PYTHONPATH
环境变量,或者指定完整路径来修改子进程的路径……但由于路径是由子进程继承的,这种情况不太可能成为问题。)