小编典典

如何更改默认 Python 版本?

all

我已经在我的 Mac 中安装了 Python 3.2。在我运行 /Applications/Python 3.2/Update Shell
Profile.command
之后,令人困惑的是,当我在终端中键入 Python -V时,它会显示 Python 2.6.1

如何更改默认 Python 版本?


阅读 123

收藏
2022-08-05

共1个答案

小编典典

[2021年更新]

(无论您使用的是 Mac、Linux 还是 Windows:)

如果您对如何启动最新版本的 python 感到困惑,在大多数平台上,python3您的python2安装会保持不变 (由于上述兼容性原因)
python3因此您可以使用该命令启动 python3 。

历史上…

命名约定通常是,大多数脚本会显式调用 python2 或 python3。发生这种情况是因为 需要向后兼容

尽管从技术上讲,python 甚至不保证次要版本之间的向后兼容性,但 Python3 确实 打破了向后兼容性。当时,调用 ‘ python
的程序需要 python2(这是当时的主要版本)。非常旧的系统可能具有期望python=python2 的程序和脚本,并且更改它会破坏这些程序和脚本。

在编写此答案时,由于维护旧脚本的兼容性,OP 不应更改此内容。

大约在 2021 年…

如今,在 python2->python3 过渡多年后,大多数软件都明确提到了 python2 或 python3(至少在 Linux
上)。例如,他们可能会调用#!/usr/bin/env python2#!/usr/bin/env python3。例如,(python-is-
python3-package)
释放了可设置为用户默认值的 python 命令,但它实际上取决于操作系统。

发行版应如何处理命令的处方python在 2011 年被写为PEP 394 - The “python” Command on Unix-Like
Systems
。它最后一次更新是在 2019 年 6 月。

基本上如果你在写一个库,你应该指定你可以使用的python版本(2或3,或者在特定情况下更细粒度)。否则,作为最终用户,您应该随意重命名它以供您个人使用(尽管您的操作系统或发行版可能不会那么容易)。

外壳别名:

但是,您可以在 shell 中创建自定义别名。你这样做的方式取决于 shell,但也许你可以这样做alias py=python3,并将它放在你的
shell 启动文件中。这仅适用于您的本地计算机(应该如此),并且与仅输入它相比有点不必要(除非您不断调用该命令)。

困惑的用户不应尝试创建
makepythonexecute的别名或虚拟环境或类似的东西python3;这是一种糟糕的形式。
现在这是可以接受的,但 PEP 394
建议鼓励用户改用virtualenv

不同的 3. 版本或 2. 版本:

在极不可能的情况下,如果有人使用两个 python3 版本(例如 3.1 和 3.2)来回答这个问题,并且您对自己安装了两个版本的 python
感到困惑,这可能是因为您已经进行了手动和/或手动安装。您可以使用您的操作系统的标准包/程序安装/卸载/管理工具来帮助跟踪事情,也许(除非您正在做的开发工作令人惊讶地受到次要版本之间的一些向后不兼容的更改的影响)删除旧版本(或者make uninstall如果您进行了手动安装,请执行此操作)。如果您需要两个版本,请重新配置您的$PATH变量,以便您想要的“默认”版本在前面;或者,如果您使用的是大多数
Linux 发行版,您正在寻找的命令是 sudoupdate-alternatives. 确保您运行的任何需要访问旧版本的程序都可以被它们的调用环境或
shell 正确调用(通过PATH在该环境中设置 var)。

关于 $PATH

旁注:详细说明 PATH:选择程序的常用方法是通过PATHecho $PATH在 Linux 和 Mac
上)环境变量。您始终可以使用完整路径运行程序,例如/usr/bin/馃敵 some args,或者cd /usr/bin然后./馃敵 some args(例如,将空白替换为我上面提到的“回声”程序),但是馃敵 some args如果没有 env
变量,则键入没有任何意义,PATH它声明了我们可以隐式搜索的目录 - 然后 -执行文件(如果/usr/bin不在PATH,那么它会说馃敵: command not found)。第一个目录中的第一个匹配命令是执行的which命令(Linux 和 Mac
上的命令会告诉您这是哪个子路径)。通常它是(例如在 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.pathsys模块或PYTHONPATH父级上设置的环境变量修改子进程的路径,或者指定完整路径…但由于路径是由子进程继承的,所以这不太可能是一个问题。)

2022-08-05