[2021 年更新]
(无论您使用的是 Mac、Linux 还是 Windows:)
如果您对如何启动最新版本的 python 感到困惑,在大多数平台上情况都是这样的python3
留下你的python2
安装完好(由于上述兼容性原因);因此你可以使用以下命令启动 python3python3
命令。
从历史上看...
命名约定是,通常大多数脚本都会显式调用 python2 或 python3。发生这种情况是由于需要向后兼容.
尽管从技术上讲,Python 甚至不能保证次要版本之间的向后兼容性,但 Python3really破坏向后兼容性。当时,程序调用'python
' 期待 python2(这是当时的主要版本)。非常旧的系统可能有期望的程序和脚本python
=python2,更改此设置会破坏这些程序和脚本。
在写这个答案时,OP 不应该因为维护旧脚本的兼容性而改变这一点。
大约在 2021 年...
如今,在 python2->python3 过渡多年之后,大多数软件明确引用 python2 或 python3(至少在 Linux 上)。例如,他们可能会打电话给#!/usr/bin/env python2
or #!/usr/bin/env python3
。这有例如(python-is-python3-package) https://askubuntu.com/questions/1296790/python-is-python3-package-in-ubuntu-20-04-what-is-it-and-what-does-it-actually释放了 python 命令,使其可以设置为用户默认值,但这实际上取决于操作系统。
发行版应如何处理的处方python
命令在 2011 年被编写为PEP 394——类 Unix 系统上的“python”命令 https://www.python.org/dev/peps/pep-0394/。上次更新时间为 2019 年 6 月。
基本上,如果您正在编写一个库,您应该指定可以使用的 python 版本(2 或 3,或者在特定情况下更细粒度)。否则,作为最终用户,您应该随意重命名它以供您个人使用(尽管您的操作系统或发行版可能不会那么容易)。
外壳别名:
不过,您可以在 shell 中创建自定义别名。你这样做的方式取决于外壳,但也许你可以这样做alias py=python3
,并将其放入 shell 启动文件中。这仅适用于您的本地计算机(应该如此),并且与仅键入它相比有些不必要(除非您不断调用该命令)。
困惑的用户不应尝试创建别名或虚拟环境或类似的内容python
执行python3
;这是很糟糕的形式。现在这是可以接受的,但 PEP 394 建议鼓励用户使用虚拟环境 https://www.python.org/dev/peps/pep-0405/反而。
不同的 3.* 版本或 2.* 版本:
在极不可能的情况下,如果有人用两个 python3 版本来回答这个问题,例如3.1 vs 3.2,并且您对以某种方式安装了两个版本的 python 感到困惑,这可能是因为您已经完成了手动和/或手动安装。您可以使用操作系统的标准包/程序安装/卸载/管理工具来帮助跟踪情况,并且也许(除非您正在做的开发工作令人惊讶地受到次要版本之间的一些向后不兼容更改的影响)删除旧版本(或者做make uninstall
如果您进行了手动安装)。如果您需要两个版本,请重新配置您的$PATH
变量,因此您想要的“默认”版本位于前面;或者如果您使用的是大多数 Linux 发行版,那么您要查找的命令是 sudoupdate-alternatives
。确保您运行的任何需要访问旧版本的程序都可以通过其调用环境或 shell 正确调用(通过设置 varPATH
在那个环境下)。
关于 $PATH 的一些信息
旁注:详细说明一下 PATH:选择程序的常用方法是通过PATH
(echo $PATH
在 Linux 和 Mac 上)环境变量。您始终可以使用完整路径运行程序,例如/usr/bin/???? some args
, or cd /usr/bin
then ./???? some args
(例如,用我上面提到的“echo”程序替换空白),但否则输入???? some args
没有的话就没有意义PATH
env 变量声明我们可以隐式搜索然后执行文件的目录(如果/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*
sidenote2:(在极少数情况下,Python 程序会调用子程序subprocess
模块,要指定运行哪个程序,可以修改子进程的路径sys.path
从 sys 模块或PYTHONPATH
在父进程上设置环境变量,或指定完整路径...但由于该路径是由子进程继承的,因此这不太可能是一个问题。)