After running brew update; brew upgrade, brew updated python to version 3.7.x.x. When my code stopped working, I noticed that some of the 3rd party packages i use are not compatible Python 3.7.x.x yet. So i decided to revert to Python 3.6.5_1 the version that i am certain i will not have any troubles with.
I failed after trying to to revert to an older version using the usual method: brew install python@3.6.5_1
or: brew install python@3.6.5
or even: brew install python@3.6
After spending some time testing solutions i found the following posts that explained the situation to a great extent:
- https://apple.stackexchange.com/questions/329187/homebrew-rollback-from-python-3-7-to-python-3-6-5-x
- https://github.com/tensorflow/tensorflow/issues/25093
So, without further due, here is the solution:
First let’s ask brew to remove the links to the most recent python version, that brew installed automatically:
$ brew unlink python
Then let’s install the version 3.6.5_1 by directing brew to the suitable commit of the python brew formula on the Homebrew formulae repository. The commit ID for Python 3.6.5_1 Formula is: f2a764ef944b1080be64bd88dca9a1d80130c558. To avoid the issue with circular dependencies the flag –ignore-dependencies must be used:
$ brew install --ignore-dependencies https://raw.githubusercontent.com/Homebrew/homebrew-core/f2a764ef944b1080be64bd88dca9a1d80130c558/Formula/python.rb
Then let’s ask brew to create the links to the freshly installed version of python:
$ brew switch python 3.6.5_1
Now could create a python 3.6.5_1 virtual environment to use it in a specific project, and then let brew update your python installation. To achieve that result with the module venv
use the --copies
option to make sure copies of the binaries (python, pip, etc.) were copied to the virtual environment folder. If --copies
was not specified, venv
will create symbolic links to the python binaries, and that means you will lose the correct version of python once brew upgrades the python binaries.
$ python -m venv myvenv --copies
Alternatively, you could stop brew from automatically upgrading python when running brew upgrade
. You simply have to tell brew that you don’t want to upgrade the python formula in the future:
$ brew pin python
You can allow brew to upgrade python by simply reverting the previous action:
$ brew unpin python
I hope this post was useful!