如何更改默认 Python 版本?
Posted
技术标签:
【中文标题】如何更改默认 Python 版本?【英文标题】:How to change default Python version? 【发布时间】:2011-08-16 07:31:00 【问题描述】:我已经在我的 Mac 中安装了 Python 3.2。在我运行 /Applications/Python 3.2/Update Shell Profile.command 之后,令人困惑的是,当我在终端中键入 Python -V 时,它会显示 Python 2.6.1 。
【问题讨论】:
相关:***.com/a/18425592/939986 请参阅opensource.com/article/19/5/python-3-default-mac 以获得使用pyenv
的良好解决方案。
【参考方案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
。这使for example (python-is-python3-package) 释放了可设置为用户默认值的 python 命令,但这确实取决于操作系统。
发行版应如何处理python
命令的处方于 2011 年写成PEP 394 -- The "python" Command on Unix-Like Systems。上次更新时间为 2019 年 6 月。
基本上,如果您正在编写一个库,您应该使用您可以使用的最具体的 python 版本。否则,作为最终用户,您应该随意重命名此名称以供您个人使用(尽管您的操作系统或发行版可能不会那么容易)。
外壳别名:
但是,您可以在 shell 中创建自定义别名。你这样做的方式取决于外壳,但也许你可以做alias py=python3
,并将它放在你的外壳启动文件中。这仅适用于您的本地计算机(应该如此),并且与仅输入它相比有些不必要(除非您不断调用该命令)。
困惑的用户不应尝试创建别名或虚拟环境或类似的使现在这是可以接受的,但 PEP 394 建议鼓励用户改用 virtualenv。python
执行python3
;这是一种糟糕的形式。
不同的 3.* 版本,或 2.* 版本:
在极不可能的情况下,如果有人用两个 python3 版本来回答这个问题,例如3.1 vs 3.2,你很困惑你以某种方式安装了两个版本的python,这可能是因为你已经完成了手动和/或手动安装。您可以使用您的操作系统的标准包/程序安装/卸载/管理工具来帮助跟踪事情,也许(除非您正在做的开发工作令人惊讶地受到次要版本之间的一些向后不兼容的更改的影响)删除旧版本(或者如果您进行了手动安装,请执行make uninstall
)。如果您需要两个版本,请重新配置您的 $PATH
变量,以便您想要的“默认”版本在前面;或者,如果您使用的是大多数 Linux 发行版,您正在寻找的命令是 sudo update-alternatives
。确保您运行的任何需要访问旧版本的程序都可以被它们的调用环境或 shell 正确调用(通过在该环境中设置 var PATH
)。
关于$PATH
旁注:详细说明一下 PATH:选择程序的常用方法是通过PATH
(Linux 和 Mac 上为echo $PATH
)环境变量。您始终可以使用完整路径运行程序,例如/usr/bin/? some args
,或cd /usr/bin
,然后是./? some args
(例如,用我上面提到的'echo'程序替换空白),但如果没有PATH
env 变量,则键入? 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模块或@修改带有sys.path
的子进程的路径987654354@ 在父进程上设置的环境变量,或指定完整路径...但由于路径是由子进程继承的,这不太可能是一个问题。)
【讨论】:
这是有用的信息,但问题是“如何更改默认的 python 版本。”我们可以添加一些东西来帮助尝试这样做的人吗? 在 Mac 上安装 Python3 也会使 Python2 保持不变。但在我看来,有一种方法可以更改仅在键入“python”时运行的默认值。我曾经遇到过这个选项。我选择保持原样,“python --version”显示 2.7.12,“python3 --version”显示 3.7.0。我同意上面的 dmeyerson 的观点,问题是如何改变它。你的建议很好,但如果你必须(或真的、真的想)有办法改变它。 > 您可能正在寻找的答案是您不应该更改它。在这里我认为这是“我该如何改变这个”! 这个答案是正确的。 不要在系统级别更改python
指向的内容,否则可能会破坏操作系统的重要组件。相反,使用单独的 Python 3 安装和 virtualen 为自己提供一个“本地”默认 Python。
这是默认python 2的mac。【参考方案2】:
查看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
【讨论】:
这是一个糟糕的解决方案。正如接受的答案中提到的,$ python
保留给 python 2。由于别名,您在计算机上运行的任何期望 python 2 的程序都会收到 python 3,这可能会产生无法预料的负面后果。
苹果的意图与问题无关。
我认为source
只兼容Bourne命令行。为了更好的兼容性,它将改为.
【参考方案3】:
在使用 python.org 安装程序的 Mac OS X 上,您需要使用 python3
而不是 python
调用 Python 3。这目前是为 Python 2 版本保留的。您也可以使用python3.2
专门调用该版本。
$ which python
/usr/bin/python
$ which python3
/Library/Frameworks/Python.framework/Versions/3.2/bin/python3
$ cd /Library/Frameworks/Python.framework/Versions/3.2/bin/
$ ls -l
total 384
lrwxr-xr-x 1 root admin 8 Apr 28 15:51 2to3@ -> 2to3-3.2
-rwxrwxr-x 1 root admin 140 Feb 20 11:14 2to3-3.2*
lrwxr-xr-x 1 root admin 7 Apr 28 15:51 idle3@ -> idle3.2
-rwxrwxr-x 1 root admin 138 Feb 20 11:14 idle3.2*
lrwxr-xr-x 1 root admin 8 Apr 28 15:51 pydoc3@ -> pydoc3.2
-rwxrwxr-x 1 root admin 123 Feb 20 11:14 pydoc3.2*
-rwxrwxr-x 2 root admin 25624 Feb 20 11:14 python3*
lrwxr-xr-x 1 root admin 12 Apr 28 15:51 python3-32@ -> python3.2-32
lrwxr-xr-x 1 root admin 16 Apr 28 15:51 python3-config@ -> python3.2-config
-rwxrwxr-x 2 root admin 25624 Feb 20 11:14 python3.2*
-rwxrwxr-x 1 root admin 13964 Feb 20 11:14 python3.2-32*
lrwxr-xr-x 1 root admin 17 Apr 28 15:51 python3.2-config@ -> python3.2m-config
-rwxrwxr-x 1 root admin 25784 Feb 20 11:14 python3.2m*
-rwxrwxr-x 1 root admin 1865 Feb 20 11:14 python3.2m-config*
lrwxr-xr-x 1 root admin 10 Apr 28 15:51 pythonw3@ -> pythonw3.2
lrwxr-xr-x 1 root admin 13 Apr 28 15:51 pythonw3-32@ -> pythonw3.2-32
-rwxrwxr-x 1 root admin 25624 Feb 20 11:14 pythonw3.2*
-rwxrwxr-x 1 root admin 13964 Feb 20 11:14 pythonw3.2-32*
如果您还从 python.org 安装了 Python 2,它将有一个类似的框架 bin 目录,没有重叠的文件名(2to3 除外)。
$ open /Applications/Python\ 2.7/Update\ Shell\ Profile.command
$ sh -l
$ echo $PATH
/Library/Frameworks/Python.framework/Versions/2.7/bin:/Library/Frameworks/Python.framework/Versions/3.2/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
$ which python3
/Library/Frameworks/Python.framework/Versions/3.2/bin/python3
$ which python
/Library/Frameworks/Python.framework/Versions/2.7/bin/python
$ cd /Library/Frameworks/Python.framework/Versions/2.7/bin
$ ls -l
total 288
-rwxrwxr-x 1 root admin 150 Jul 3 2010 2to3*
lrwxr-x--- 1 root admin 7 Nov 8 23:14 idle@ -> idle2.7
-rwxrwxr-x 1 root admin 138 Jul 3 2010 idle2.7*
lrwxr-x--- 1 root admin 8 Nov 8 23:14 pydoc@ -> pydoc2.7
-rwxrwxr-x 1 root admin 123 Jul 3 2010 pydoc2.7*
lrwxr-x--- 1 root admin 9 Nov 8 23:14 python@ -> python2.7
lrwxr-x--- 1 root admin 16 Nov 8 23:14 python-config@ -> python2.7-config
-rwxrwxr-x 1 root admin 33764 Jul 3 2010 python2.7*
-rwxrwxr-x 1 root admin 1663 Jul 3 2010 python2.7-config*
lrwxr-x--- 1 root admin 10 Nov 8 23:14 pythonw@ -> pythonw2.7
-rwxrwxr-x 1 root admin 33764 Jul 3 2010 pythonw2.7*
lrwxr-x--- 1 root admin 11 Nov 8 23:14 smtpd.py@ -> smtpd2.7.py
-rwxrwxr-x 1 root admin 18272 Jul 3 2010 smtpd2.7.py*
【讨论】:
关于“目前为 Python 2 版本保留”的问题,你有链接吗? 如果我有 python 3.4 和 python 3.7,当我从终端输入 python3 时,它执行 python 3.4 而不是 3.7,如何解决这个问题?【参考方案4】:老问题,但是:
virtualenv --python=python3.5 .venv
source .venv/bin/activate
【讨论】:
当然,但如果您没有可执行文件(例如 python3.5),则此解决方案不起作用。 我认为这涵盖了***.com/questions/5506110/…【参考方案5】:做正确的事,做正确的事!
--->Zero 打开你的终端,
--首先输入python -V
,可能显示:
Python 2.7.10
-第二次输入python3 -V
,可能显示:
Python 3.7.2
--第三次输入where python
或which python
,可能显示:
/usr/bin/python
---第四次输入where python3
或which python3
,可能显示:
/usr/local/bin/python3
--第五次在你的PATH环境变量文件的底部添加以下行,在Bash下的~/.profile file or ~/.bash_profile
或zsh下的~/.zshrc
中。
alias python='/usr/local/bin/python3'
或
alias python=python3
-第六次在Bash下输入source ~/.bash_profile
或在zsh下输入source ~/.zshrc
。
--第七次退出终端。
---第八次打开终端,输入python -V
,可能会显示:
Python 3.7.2
我已经成功尝试了。
其他,zsh下的~/.bash_profile
不是~/.bash_profile
。
zsh 下的 PATH 环境变量通过~/.zshrc
代替~/.profile
(或~/.bash_file
)。
帮助你们!
【讨论】:
【参考方案6】:通过将“默认”Python 放在路径上的系统 Python 之前来更改它,例如:
export PATH=/usr/local/bin:$PATH
【讨论】:
我的假设是,这样做可能会破坏 Mac 上的某些内容。由于有许多程序和脚本使用“python”别名。如果突然间,由于 PATH 中的优先级更改,它们开始指向 Python3 而不是 Python2 - 这可能会破坏某些东西。可能是整个操作系统……不过这是我的假设,未经测试。 任何系统软件都将使用系统提供的 Python 的完整路径。【参考方案7】:将 Python 3.5 设置为更高的优先级
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 2
检查结果
sudo update-alternatives --config python
python -V
【讨论】:
这帮我解决了问题,因为python2的优先级较高,很多软件都出现故障,【参考方案8】:检查python3所在库的执行路径
$ which python3
/usr/local/bin/python3 some OS might have /usr/bin/python3
打开 bash_profile 文件并添加别名
vi ~/.bash_profile
alias python='/usr/local/bin/python3' or alias python='/usr/bin/python3'
重新加载 bash_profile 以使修改生效
source ~/.bash_profile
运行 python 命令并检查它是否正在使用 python3 加载
$ python --version
Python 3.6.5
【讨论】:
【参考方案9】:根据快速谷歌搜索,此更新仅适用于您当前打开的 shell。它可能可以通过键入 python3 来修复,因为 mac 和 linux 足够相似,这样的事情会重合。 Link to the result of google search.
另外,正如 ninjagecko 所说,大多数程序还没有更新到 3.x,因此将默认 python 设置为 3.x 会破坏应用程序中使用的许多 python 脚本。
【讨论】:
【参考方案10】:我使用的是 OS X 10.7.5 和 Python 3.4.2。如果您键入 python3
并且您想要运行的内容将使用 python 3 运行它。例如
pyhton3 test001.py
。那运行了一个我制作的名为 test001 的测试程序。我希望这会有所帮助。
【讨论】:
欢迎来到 Stack Overflow!看起来您的答案并不是所问问题的真正答案。如果您想修复它,请参考***.com/help/how-to-answer 寻求帮助。 我花了好几个小时试图让 python3 在我的 Mac 上工作——结果是输入“python3”而不是旧的“python”就可以了。【参考方案11】:您可以使用以下命令临时更改或在不同版本之间切换:
set path=C:\Users\Shaina\AppData\Local\Programs\Python\Python35-32;%PATH%
python --version
【讨论】:
【参考方案12】:导航到:
我的电脑 -> 属性 -> 高级 -> 环境变量 -> 系统变量
假设您已经在路径变量中添加了 python 2.7,并且您想将默认路径更改为 python 3.x
然后在python2.7路径之前添加python3.5.x文件夹的路径。
打开cmd:输入“python --version”
python版本将更改为python 3.5.x
【讨论】:
那是 Windows。 一些包含终端/cmds/consoles 的 IDE 会传播环境变量。重新启动 IDE 以获取嵌入终端中的更改。【参考方案13】:简而言之:更改环境变量中的路径!
对于 Windows:
高级System Settings > Advance (tab)
。在底部你会找到'Environment Variables'
双击Path
。您将看到其中一个 python 安装的路径,将其更改为所需版本的路径。
【讨论】:
【参考方案14】:就我而言,在我的 Mac OSX 上,通过 mac 端口安装了 Python 2.7.18,我能够将 python 版本设置为 2.7:
$ sudo port select --set python python27
所以:
$ python -V
Python 2.7.18
【讨论】:
另外,MacPorts 不会设置python2
和 python3
命令。您可以使用 port select 来执行此操作,例如:sudo port select --set python3 python37
.【参考方案15】:
sudo mv /usr/bin/python /usr/bin/python2
sudo ln -s $(which python3) /usr/bin/python
这会破坏脚本,但正是改变 python 的方法。您还应该重写脚本以不假定 python
是 2.x。无论您在哪里拨打system
或exec
,这都将起作用。
【讨论】:
【参考方案16】:应该注意的是,由于 Homebrew 安装 Python 的位置发生了变化,最新版本的 Homebrew/MacOS 将需要不同的 PATH 条目。像这样添加到您的 .zshrc 中:
export PATH="/opt/homebrew/opt/python/libexec/bin:$PATH"
这将确保 Homebrew 安装的适当的未版本控制的 python 链接出现在版本 2.x 之前,并将保护您免受任何版本的 python 更新的影响,因为 brew 会在更新版本时更新未版本控制的链接。
【讨论】:
【参考方案17】:从 macOS Catalina 开始,默认 shell 是 zsh
。因此,所有这些~/.bash_profile
更改不会在您打开新终端时更改默认值,因为新终端是 zsh shell 而不是 bash shell。
您可以通过输入 echo $SHELL
来确认您的终端是 zsh shell,您应该会看到回复:zsh
。
你应该怎么做?您应该使用适用于zsh
shell 和 bash
shell 的解决方案。因此,请执行以下操作:
-
输入:
vi ~/.bash_profile
输入:alias python='python3'
关闭并保存您的bash_profile
。输入::wq
现在打开/创建您的 zsh 配置文件。输入:vi ~/.zshrc
在 zshrc 中获取 bash。输入:source ~/.bash_profile
现在,python 将在您的 zsh shell 中自动别名为 python3(如果您切换默认值,则在 bash 中)。
测试:
python --version
Python 3.8.9
【讨论】:
我在虚拟环境中运行一个名为 odoo 的程序,使用:~/odoo-env/bin/activate
,然后是python ./odoo.py
。在某些时候,我更新到 v3 并且两者都在我的 macos 上,但是当我现在运行它时,如果我在 bash_profile 中有别名并且如果我删除别名,我会得到这个/usr/local/bin/python3: can't open file '/odoo.py'
,如果我删除了这个别名,我会得到这个:Library not loaded: @executable_path/../.Python Referenced from: /Users/mars/odoo-env/bin/python2.7 Reason: tried: '/Users/mars/odoo-env/bin/../.Python' (no such file), '/usr/local/lib/.Python' (no such file), '/usr/lib/.Python' (no such file) Abort trap: 6
请 hlp
我刚刚注意到我的 usr/lib 或 usr/local/lib 中没有 .Python。我有的是前者的python2.7和后者的python 2.7和python3.9。【参考方案18】:
为了在不导出环境变量的情况下更改python版本上下文切换。请使用以下视频链接查看: https://youtu.be/jTN4MHNhJZs
【讨论】:
【参考方案19】:将较新版本的python安装到您的计算机后...
当您想从终端运行 python 程序(例如“program.py”)时(使用系统上最新版本的 python);而不是运行'python program.py'运行'python3 program.py'
同样,如果你想在终端中使用 python(在你的系统上使用最新版本的 python)运行 'python3' 而不是 'python'
作为测试尝试在终端中运行'python3 --v'...
【讨论】:
请重新阅读问题:它不问如何运行Python程序? 我做了以下假设:如何在终端中更改python的默认版本--隐式等效于--如何更改为python的默认版本(到最新版本的python on my system) 在终端中 -- 隐式等效于 -- 默认情况下,我如何在终端中使用最新版本的 python -- 隐式等效于 -- 我如何运行 python 程序终端在我的系统上使用最新版本的 python - 这是我回答的问题。 我没有回答 - 如何运行 python 程序?以上是关于如何更改默认 Python 版本?的主要内容,如果未能解决你的问题,请参考以下文章
linux usr/bin/和 usr/local/bin之间的关系; 什么是软链接等等; 如何更改默认python版本;
linux usr/bin/和 usr/local/bin之间的关系; 什么是软链接等等; 如何更改默认python版本;