如何使用Homebrew在macOS上安装Python 3的以前版本?

160

如何使用brew在macOS中安装Python 3的旧版本?

使用命令 brew install python ,我得到了Python 3的最新版本(目前为v3.7.0),但我想要Python 3.6的上一个版本(当前为3.6.5)。

我已经了解了另一个软件包pyenv,可以帮助处理不同的python安装,但这个解决方案不适合我。


6
就我所知,Homebrew对于多个Python版本的支持非常糟糕,而且越来越糟。我建议你完全避免使用Homebrew安装Python。Python.org提供了适用于macOS的各种版本的Python安装包,可以并行安装在一起(如果需要,还可以与Homebrew安装的Python并行安装)。使用这些安装包或类似pyenv的工具最终会在长远的未来为你省下很多麻烦。 - Daniel Pryden
在我看来,应该在手动下载和安装网站之前推荐使用pyenv。已经使用homebrew的人可能正在寻找一个好的命令行解决方案。对于任何浏览此处的人,请向下滚动:https://dev59.com/xVUK5IYBdhLWcg3w4jQv#60189988 - Fr4nc3sc0NL
8个回答

268

简短回答

进行Python 3.6.5的全新安装,请使用以下命令:

brew unlink python # ONLY if you have installed (with brew) another version of python 3
brew install --ignore-dependencies https://raw.githubusercontent.com/Homebrew/homebrew-core/f2a764ef944b1080be64bd88dca9a1d80130c558/Formula/python.rb

如果您希望恢复先前安装的版本,则:

brew info python           # To see what you have previously installed
brew switch python 3.x.x_x # Ex. 3.6.5_1

长答案

使用Homebrew安装Python有两个公式:python@2python
第一个是用于Python 2,第二个是用于Python 3。

注意:您可能会在网络上找到过时的答案,其中提到python3作为安装Python版本3的公式名称。现在只有python

默认情况下,这些公式可以安装相应主要版本的Python的最新版本。因此,您无法直接安装像3.6这样的次要版本。

解决方案

使用brew,您可以使用公式的地址(例如在git存储库中)安装软件包。

brew install https://the/address/to/the/formula/FORMULA_NAME.rb

或者专门针对Python 3

brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/COMMIT_IDENTIFIER/Formula/python.rb

你需要指定的地址是所需版本公式(python.rb)的最后一次提交的地址。 您可以通过查看homebrew-core/Formula/python.rb的历史记录找到提交标识符。

https://github.com/Homebrew/homebrew-core/commits/master/Formula/python.rb

Python > 3.6.5

在上面的链接中,您将找不到Python 3.6.5以上版本的公式。在那个(官方)存储库的维护者发布Python 3.7之后,他们只向Python 3.7的配方提交更新。
如上所述,使用homebrew时,您只有Python 2(python@2)和Python 3(python),并且没有针对Python 3.6的明确公式。
尽管这些次要更新在大多数情况下对大多数用户来说都不太重要,但我会搜索是否有人为3.6制作了明确的公式。

2
这会对依赖于默认python3解释器的Homebrew软件包产生什么影响或交互作用? - Telemachus
2
我已经安装了3.7版本,但是收到了这个错误信息:Error: python 3.7.0 is already installed To install 3.6.5_1, first run brew unlink python``。在使用“简短回答”时,请注意。 - wuliwong
2
感谢您提供3.6.5的直接提交链接。您让我免于绝望的境地。 - tsalaroth
4
我知道这个问题有点旧了,但我仍在努力尝试弄清楚你是怎么得到那个公式的链接的。当前版本的3.6是3.6.7,有没有什么简单的方法可以找到这个公式? - diek
1
如果您不再需要Python3.6.5版本,如何卸载它? - acidjunk
显示剩余15条评论

42

我已经尝试了各种方法,但仍然无法使其正常工作。最后我使用了 pyenv ,它直接像魔法一样工作了。

所以,如果你已经安装了homebrew,只需执行以下操作:

brew install pyenv
pyenv install 3.6.5

管理虚拟环境:

brew install pyenv-virtualenv
pyenv virtualenv 3.6.5 env_name

请参阅pyenvpyenv-virtualenv了解更多信息。

编辑(2020/03/19)

我发现使用pyenv-installer比homebrew更容易直接安装pyenv和pyenv-virtualenv:

curl https://pyenv.run | bash

要管理Python版本,可以全局地进行:

pyenv global 3.6.5

或者在给定目录中进行本地操作:

pyenv local 3.6.5

这实际上并没有直接回答问题,而是通过“virtualenv”方法来规避它。 - WestCoastProjects
5
实际上,virtualenv 不是必须的。使用 pyenv 可以管理 Python 版本,无需使用虚拟环境。 - ClementWalter
我想在大多数情况下,这是最好的解决方案。 - Fr4nc3sc0NL
在 Mac 12.3 升级后,出现了以下错误 - “未编译 Python zlib 扩展”。 - P P

32

作为更新,当进行操作时

brew unlink python # If you have installed (with brew) another version of python
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/f2a764ef944b1080be64bd88dca9a1d80130c558/Formula/python.rb

您可能会遇到

Error: python contains a recursive dependency on itself:
  python depends on sphinx-doc
  sphinx-doc depends on python
要绕过它,请在brew install命令中加入--ignore-dependencies参数。

要绕过它,请在brew install命令中加入--ignore-dependencies参数。

brew unlink python # If you have installed (with brew) another version of python
brew install --ignore-dependencies https://raw.githubusercontent.com/Homebrew/homebrew-core/f2a764ef944b1080be64bd88dca9a1d80130c558/Formula/python.rb

1
然后你将会遇到依赖地狱的噩梦...就像 https://discourse.brew.sh/t/brew-install-python3-fails/1756/7 - confiq
4
一开始这个方法对我没用;本质上,我得做这个:brew install --debug --ignore-dependencies https://raw.githubusercontent.com/Homebrew/homebrew-core/f2a764ef944b1080be64bd88dca9a1d80130c558/Formula/python.rb当它在“make html”时失败了,只需选择2)忽略错误。HTML / 文档的故障可能会在以后给我带来麻烦,但目前它运作正常:shrug: - beans

29

我所做的是首先安装了Python 3.7,然后使用以下命令取消链接。

brew install python3
brew unlink python

然后我使用上面答案中提供的以下命令安装了Python 3.6.5。

brew install --ignore-dependencies https://raw.githubusercontent.com/Homebrew/homebrew-core/f2a764ef944b1080be64bd88dca9a1d80130c558/Formula/python.rb --ignore-dependencies

之后我运行了以下命令

brew link --overwrite python

现在我已经在系统中安装了所有的Python。要查找运行:

Now I have all pythons in the system. To find out run

mian@tdowrick2~ $ python --version
Python 2.7.10
mian@tdowrick2~ $ python3.7 --version
Python 3.7.1
mian@tdowrick2~ $ python3.6 --version
Python 3.6.5

创建 Python 3.7 虚拟环境。

mian@tdowrick2~ $ virtualenv -p python3.7 env
Already using interpreter /Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7
Using base prefix '/Library/Frameworks/Python.framework/Versions/3.7'
New python executable in /Users/mian/env/bin/python3.7
Also creating executable in /Users/mian/env/bin/python
Installing setuptools, pip, wheel...
done.
mian@tdowrick2~ $ source env/bin/activate
(env) mian@tdowrick2~ $ python --version
Python 3.7.1
(env) mian@tdowrick2~ $ deactivate

创建Python 3.6虚拟环境

mian@tdowrick2~ $ virtualenv -p python3.6 env
Running virtualenv with interpreter /usr/local/bin/python3.6
Using base prefix '/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/mian/env/bin/python3.6
Not overwriting existing python script /Users/mian/env/bin/python (you must use /Users/mian/env/bin/python3.6)
Installing setuptools, pip, wheel...
done.
mian@tdowrick2~ $ source env/bin/activate
(env) mian@tdowrick2~ $ python --version
Python 3.6.5
(env) mian@tdowrick2~ $ deactivate

1
尽管看起来这会很棒,但它不再起作用,结果如下:python -V && python3.7 -V && python3 -V && python3.6 -VPython 2.7.15 Python 3.7.3 Python 3.7.3 zsh: command not found: python3.6 - Wafer
1
仔细看我的答案,对于3.6版本您需要输入python3.6 -V。您已经两次输入了python3 -V,这就是为什么您会得到两个3.7.3并且缺少了3.6的原因。 - Dr. Mian
1
对我来说,这将 python3.6 隐藏在 /usr/local/Cellar/python/3.6.5_1/bin 下。一旦我建立了一个链接,它就像你所说的那样工作。这个 Python 自管理系统似乎是由数百万程序员通过布朗运动编码而成的鲁比·戈尔德伯格分形。 - Eric Leschinski

15
我尝试了上面所有的答案来安装Python 3.4.4。Python的安装成功了,但是无法安装PIP,我试过了很多方法都没能解决。我使用的是Mac OSX Mojave,这导致了一些与zlib和openssl相关的问题。 不要做什么:
  • 尽量避免使用Homebrew安装先前版本的PythonPython3
  • 不要尝试编译Python
解决方案:
  1. 下载macOS 64位安装程序macOS 64位/32位安装程序https://www.python.org/downloads/release/python-365/
  2. 在上一步中,它会下载Python 3.6.5,如果你想下载Python 3.4.4,请将上面的URL中的python-365替换为python-344
  3. 下载后,单击你下载的文件,一个GUI安装程序将打开
  4. 如果你下载了python-365,安装后,要启动该版本的Python,你需要在终端中输入python365,pip也是同样的方式,即pip365

附注:你不必卸载系统中的其他Python版本。


编辑:


我发现了一种更好的解决方案,适用于MacOSX、Windows、Linux等操作系统。

  1. 你已安装Python或未安装都无关紧要。
  2. 下载Anaconda
  3. 安装完成后,在终端中键入:conda init
  4. 在终端中使用任何Python版本创建虚拟环境,例如我选择了3.4.4版本:conda create -n [你的虚拟环境名称] python=3.4.4
  5. 然后,在终端中使用命令conda info --envs检查所有已创建的虚拟环境。
  6. 最后,在终端中使用命令conda activate [步骤5中显示的虚拟环境名称]激活所选的虚拟环境。

1
这对我有用,在Mac Catalina上。我安装了3.9和3.7,通过第一种方法安装了3.6.5。现在唯一的区别是要启动这个版本的Python,你需要在终端中输入python3.6,pip也是同样的方式,它将是pip3.6。您还可以通过以下方式检查安装:- python3.6 --version - Rishijay Shrivastava
对于任何在2021-12-07寻找答案的人来说,conda方式是我个人使用过的最好且唯一有效的方法。 - karolyzz

8

如果有人遇到以下pip问题

pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

问题的根源是openssl 1.1不再支持python 3.6。因此,您需要安装旧版本的openssl 1.0。

以下是解决方案:

brew uninstall --ignore-dependencies openssl
brew install https://github.com/tebelorg/Tump/releases/download/v1.0.0/openssl.rb

0
为了使用homebrew解决这个问题,您可以暂时回溯homebrew-core并设置HOMEBREW_NO_AUTO_UPDATE变量以保持不变:
cd `brew --repo homebrew/core`
git checkout f2a764ef944b1080be64bd88dca9a1d80130c558
export HOMEBREW_NO_AUTO_UPDATE=1
brew install python

我不建议永久性地将homebrew-core回溯,因为您会错过安全补丁,但它对于测试目的很有用。
您还可以使用brew extract命令将旧版本的homebrew公式提取到自己的tap(tap_owner/tap_name)中:
brew extract python tap_owner/tap_name --version=3.6.5

我如何找出给定软件包的tap_owner和tap_name? - Sunder

0

对我来说最简单的方法是安装Anaconda: https://docs.anaconda.com/anaconda/install/

在那里我可以创建尽可能多的带有不同Python版本的环境,并且通过鼠标点击在它们之间切换。这不能更容易了。

要安装不同的Python版本,只需按照这些说明https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-python.html即可。

使用不同Python版本的新开发环境只需2分钟即可完成。而且在将来我可以轻松地来回切换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接