200

I have been having issues with openssl and python@2 with brew, which have explained here (unresolved). The documented workaround to reinstall Python and openssl was not working, so I decided I would uninstall and reinstall Python.

The problem is, when you try to install Python 2 with brew, you receive this message:

brew install python@2
Error: No available formula with the name "python@2"
==> Searching for a previously deleted formula (in the last month)...
Warning: homebrew/core is shallow clone. To get complete history run:
  git -C "$(brew --repo homebrew/core)" fetch --unshallow

python@2 was deleted from homebrew/core in commit 028f11f9e:
  python@2: delete (https://github.com/Homebrew/homebrew-core/issues/49796)
  EOL 1 January 2020.
  We gave it 1 month more to live so that people had time to migrate.
  All in all, developers had 11 years to do their migration.
  You can use the `brew extract` command and maintain python@2 in your own
  tap if necessary:
  https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap

To show the formula before removal run:
  git -C "$(brew --repo homebrew/core)" show 028f11f9e^:Formula/[email protected]

If you still use this formula consider creating your own tap:
  https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap

Unfortunately I still have a number of brew formulas that depend on Brew's python@2. Those include awscli, letsencrypt, pr sshuttle for example

aws
zsh: /usr/local/bin/aws: bad interpreter: /usr/local/opt/python@2/bin/python2.7: no such file or directory

I don't know how to use this brew extract command they documented to reinstall Python@2. It needs a formula and a tap. I imagine the formula would be python@2. I'm not sure what the tap would need to be.

Additionally reinstalling the taps such as aws or letsencrypt is not working very well either.

After reinstalling awscli (brew reinstall awscli), running aws commands still gives errors.

aws
/usr/local/Cellar/awscli/2.0.0/libexec/lib/python3.8/site-packages/jmespath/visitor.py:32: SyntaxWarning: "is" with a literal. Did you mean "=="?
  if x is 0 or x is 1:
/usr/local/Cellar/awscli/2.0.0/libexec/lib/python3.8/site-packages/jmespath/visitor.py:32: SyntaxWarning: "is" with a literal. Did you mean "=="?
  if x is 0 or x is 1:
/usr/local/Cellar/awscli/2.0.0/libexec/lib/python3.8/site-packages/jmespath/visitor.py:34: SyntaxWarning: "is" with a literal. Did you mean "=="?
  elif y is 0 or y is 1:
/usr/local/Cellar/awscli/2.0.0/libexec/lib/python3.8/site-packages/jmespath/visitor.py:34: SyntaxWarning: "is" with a literal. Did you mean "=="?
  elif y is 0 or y is 1:
/usr/local/Cellar/awscli/2.0.0/libexec/lib/python3.8/site-packages/jmespath/visitor.py:260: SyntaxWarning: "is" with a literal. Did you mean "=="?
  if original_result is 0:
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: the following arguments are required: command
1

15 Answers 15

386

You can use pyenv to install python with:

brew install pyenv
pyenv install 2.7.18

Optionally set it to your global default:

pyenv global 2.7.18

Nice article on why using pyenv is better than using brew to manage your python installation.

To make python binary available globally, add shims to PATH:

PATH=$(pyenv root)/shims:$PATH
10
  • 15
    This worked the best for me after macOS 12.3 Monterey removed python 2.7. Commented Apr 13, 2022 at 17:34
  • 11
    Sorry for a newbie question but do I get a global python or python2 to work? After following the steps above, which python says "python not found". (which python3 works and it returns /opt/homebrew/bin/python3). Commented Apr 21, 2022 at 15:17
  • 1
    Not working in macOS 12.6 Intel) - I had such hope. For the record, binutils is not installed
    – goofology
    Commented Oct 16, 2022 at 20:38
  • 5
    I don't recommend this because it tries to build Python from source, which will take forever and possibly fail (as it did for me on my M1 Mac). Plus pyenv is one more moving part that you probably don't need.
    – sudo
    Commented Oct 23, 2022 at 23:04
  • 1
    Confirmed to work on M2 running Ventura
    – dland
    Commented Nov 7, 2023 at 12:29
181

It seems that the homebrew staff really makes it as hard as possible to use Python 2.7 on macOS as they can.

  1. The linked brew extract link is really not helpful, you need to look for answers here about how to make your own tap from extracted sources.
  2. The linked commit: 028f11f9e is wrong, as it contains the already deleted file.
  3. The brew extract command doesn't even work correctly, because of the @ in the package name.

The solution is very simple though, you just need to download the latest known commit and install from that file:

cd ~
wget https://raw.githubusercontent.com/Homebrew/homebrew-core/86a44a0a552c673a05f11018459c9f5faae3becc/Formula/[email protected]
brew install [email protected]
rm [email protected]

There might be a warning about this being "unstable", which I don't understand as a commit in a Git history is as stable as you can get.

19
  • 16
    Just putting the link to the PR here, where python@2 was removed (merged Feb. 4th 2020) github.com/Homebrew/homebrew-core/pull/49796
    – petschki
    Commented Mar 12, 2020 at 20:14
  • 10
    @petschki not the answer we asked for, but the answer we wanted to know! Commented Apr 16, 2020 at 19:47
  • 22
    This (brew install <raw url>) does not seem to work anymore with the current version of Homebrew, it produces the following error: Error: Calling Installation of python@2 from a GitHub commit URL is disabled! Use 'brew extract python@2' to stable tap on GitHub instead.
    – jvf
    Commented Sep 3, 2020 at 13:53
  • 10
    Not working from the last commit... ==> Downloading https://ghcr.io/v2/homebrew/core/python/2/manifests/2.7.17_1 ##O#- # curl: (22) The requested URL returned error: 404 Error: Failed to download resource "python@2_bottle_manifest" Download failed: https://ghcr.io/v2/homebrew/core/python/2/manifests/2.7.17_1 Commented Apr 24, 2021 at 12:13
  • 14
    Got below error while execute brew install [email protected] Error: python@2: Invalid bottle tag symbol
    – loongman
    Commented May 31, 2022 at 10:32
132

For those showing up here after Apple removed the system python in macOS 12.3, here's how to install and run python2 and python3.

Python 2

python, python2 -> python 2.7

# Download/run the legacy macOS installer (pick which one for your sys)
https://www.python.org/downloads/release/python-2718/

# Add pip for python2.7
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip2.py
python2 get-pip2.py

# Optionally check for pip updates (in case of post-eol patches)
python2 -m pip install --upgrade pip

# Optionally add the helpers like easy_install back onto your path
# In your ~/.zprofile or whatever bash/shell profile equivalent
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH

# Optionally add some helpers while editing shell profile
alias pip2="python2 -m pip"
alias venv2="virtualenv -p python2"
alias venv3="virtualenv -p python3"

# Optionally some apple-specific std libraries are missing, search
# and download them. Example: plistlib.py
curl https://raw.githubusercontent.com/python/cpython/2.7/Lib/plistlib.py -o /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plistlib.py

# Lastly, there is no symlink /usr/bin/python anymore
# /usr/bin is system protected so you can't add one either
# 
# Change your programs to use /usr/local/bin/python
# or google how to disable macOS SIP to make a symlink in /usr/bin

Python 3

python3 -> python 3

brew update
brew install python3

# Add pip for python 3 in case it is missing
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py

# Check for pip updates
python3 -m pip install --upgrade pip

# Optionally add a helper in ~/.zprofile
alias venv3="virtualenv -p python3"

Test it out

~ % python --version
Python 2.7.18

~ % python2 --version
Python 2.7.18

~ % python3 --version
Python 3.9.10

# Running older python2
python2 -m pip install...
python2 ...

# Testing the venv2 alias from above
venv2 foo
source foo/bin/activate
pip -V # pip 20... from... python2.7
pip install -y -r req.txt
pip uninstall -y -r req.txt
pip freeze
deactivate

# Testing the venv3 alias from above
venv3 foo3
source foo3/bin/activate
pip -V # pip22... from ...python3.9
pip install -y -r req.txt
pip uninstall -y -r req.txt
pip freeze
deactivate

Troubleshooting via uninstall / reinstall

# Credit to https://www.macupdate.com/app/mac/5880/python/uninstall  
# for many of the tips in this section.

# Sometimes there are problems related to accepting xcode 
# tool agreement. Open XCode to make sure it finished 
# installing its tool updates.

# Remove old python Application installs
# open the apps dir and delete Python 2, 3 via Finder
open /Applications

# Remove old brew installs 
brew list | grep python
brew uninstall python
brew uninstall python3

# find/remove lingering unlinked kegs
ls /usr/local/Cellar/ | grep python 

# Cleanup binaries
sudo rm -rf /Library/Frameworks/Pyth*
rm /usr/local/bin/pip*

# Cleanup symlinks
which -a python # check results, and rm each one
which -a python2 # check results, and rm each one
which -a python3 # check results, and rm each one

brew cleanup # prunes symlinks
5
  • 22
    You sir, deserve a medal. Thanks much!
    – Rajiv
    Commented Mar 18, 2022 at 6:46
  • I don't think you need to install pip separately: it comes with the python.org installer. Also, I have the python Framework in my $PATH, and I'm sure I didn't do it manually, so I think that gets done, too.
    – benwiggy
    Commented Mar 20, 2022 at 12:32
  • 1
    You sir, are a genius Commented Apr 18, 2022 at 5:20
  • 1
    The latest version is now 2.7.18 but this was the guide that I needed, thanks.
    – rtpHarry
    Commented Nov 14, 2022 at 21:09
  • Thank you @Josh Hibschman, I followed your steps for 2.7 and it worked like a charm Commented Jan 8 at 18:06
60

How to install python@2 from a local tap

The following method works with the current version (c9b8a3ef6) of brew:

$ brew tap-new <user>/homebrew-python2
$ brew extract python@2 <user>/homebrew-python2
$ brew install /usr/local/Homebrew/Library/Taps/<user>/homebrew-python2/Formula/[email protected]

The brew tap-new command creates a new local tap template in /usr/local/Homebrew/Library/Taps/<user>/homebrew-python2. The tap name needs a <user> and a <repo> component separated by a /. The actual values are arbitrary. The naming above follows the conventions from How to Create and Maintain a Tap. If you wanted to push the tap to GitHub you would use your GitHub username as user. Pushing to GitHub is not necessary (and was not performed in the instructions above).

The brew extract commands extracts the recent version of formula from the repos history into the given (local) tap. In our case [email protected] is extracted.

The brew install command finally installs the formula.

Why is this necessary?

The method discussed above (installing an old version of the formula from a GitHub commit URL) does not work anymore for python@2 with the current version of brew (c9b8a3ef6), it produces the following error:

$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/86a44a0a552c673a05f11018459c9f5faae3becc/Formula/[email protected]
Updating Homebrew...
==> Auto-updated Homebrew!
Updated Homebrew from 88f17b8b6 to c9b8a3ef6.
...
Error: Calling Installation of python@2 from a GitHub commit URL is disabled! Use 'brew extract python@2' to stable tap on GitHub instead.
4
  • This was helpful as I was trying to install an old version of openssl. One note: <user> in the example above is your Github username.
    – heyrolled
    Commented Sep 3, 2020 at 16:44
  • Thank you for the updated answer. <user> does not have to be your github username; it can be anything or nothing. Using your login name on your local machine is a good way to not have it collide with other users on your computer, if any.
    – sirdodger
    Commented Sep 4, 2020 at 20:23
  • 4
    This should be the answer since the accepted answer is no longer working.
    – KTU
    Commented Sep 9, 2020 at 1:27
  • 2
    These instructions don't work for me unfortunately. When attempting brew extract python@2 <user>/homebrew-python2, I get: Error: python@2: undefined method `[]' for nil:NilClass
    – P A N
    Commented Oct 29, 2021 at 11:58
18

Please check following command (I am using it on macOS 10.13, it is possible that for a newer macOS it will work without source compilation):

brew install pr0d1r2/python2/[email protected] --build-from-source
2
  • 7
    This worked but this also reinstalled my Python3. Which means it removed all the packages I had installed with it. Thanks though.
    – Danyal
    Commented Sep 14, 2020 at 15:51
  • I've reported this but it won't build under Sonoma on my M1 mac Commented May 29 at 6:20
12

this work for me on m1(12.3.1):
dont use brew, download from python official website directly.
This question has tortured me for a long time :(

2
  • 1
    @Dos This nonetheless provides an answer to the underlying problem; please see What is the XY problem?.
    – awwright
    Commented May 23, 2022 at 23:15
  • 2
    This solved my problem. Really simple, thaks
    – saga56
    Commented Jun 28, 2022 at 11:01
5

For posterity, working on macOS 10.15 (May/2021):

/usr/local/bin/brew tap-new ${USER}/homebrew-python2

/usr/local/bin/brew extract python@2 ${USER}/homebrew-python2

/usr/local/bin/brew install /usr/local/Homebrew/Library/Taps/${USER}/homebrew-python2/Formula/[email protected]

# https://github.com/Homebrew/brew/issues/5734#issuecomment-464705002
/usr/local/bin/brew untap ${USER}/python2
3

Not about using Homebrew, but asdf-python worked for me flawlessly as I was able to install and use Python 2.7.18 from it. (The top-voted answer seems to fail on my system, M1 Max MBP with MacOS 12.3. A few other answers also seem convoluted and didn't work.)

3

If you just want make python2 work on Mac the most effective way is access https://www.python.org/downloads/ and download the pkg of this version of python.

Seems that homebrew doesn`t support python2 anymore.

best regards.

1

None of the answers on this page worked for me1 in MacOS Monterey. In case this helps anyone, here is an alternative solution, which is not technically installed directly via Homebrew – just indirectly.

A simple solution for me, that works, is to install Anaconda via Homewbrew, and then create a virtual environment for Python 2.7.

Note: Installing Anaconda will take up some space on your computer, moreso than just simply installing Python 2.7 via Homebrew or Pyenv:

Anaconda is a distribution of the Python and R programming languages for scientific computing (data science, machine learning applications, large-scale data processing, predictive analytics, etc.), that aims to simplify package management and deployment. The distribution includes data-science packages suitable for Windows, Linux, and macOS. https://en.wikipedia.org/wiki/Anaconda_(Python_distribution)

Very basically, the steps are as follows – but you may want to refer to a full install guide for more details.

Install Anaconda from Homebrew:

brew install --cask anaconda

When installed, create a virtual environment for Python 2.7 in a folder of your choice, in this case for Python 2.7.18:

conda create --prefix=/MY_FOLDER/NAME_OF_ENVIRONMENT python=2.7.18

You can list the environments:

conda env list

Activate the environment via:

conda activate NAME_OF_ENVIRONMENT

Now you can install packages, etc, as usual, using pip install <package> or alternatively conda install <package>.

NB: If your Anaconda install is fresh,

  1. You may be prompted to run conda init once before you can activate the virtual environment.

  2. You may have to run the below in order to be able to find the virtual environment (e.g. via conda list env) which will add a line in ~/.condarc:

    conda config --append envs_dirs /MY_FOLDER/NAME_OF_ENVIRONMENT

  3. If you are annoyed by the text which may say "Py base" whenever you open Terminal, do the following per this answer, which will add a line in ~/.condarc:

    conda config --set auto_activate_base false

  4. Once you have activated the environment, to shorten the path to it that appears in Terminal whenever it is active, add this row to ~/.condarc:

    env_prompt: ({name})


1 I am not sure if it is because something relating to Python installs is broken on my Mac – so you may not have the same issues. But I was running into problems with all the solutions: everything from installing virtualenv for the native MacOS Python install did not succeed, build error when attempting to install 2.7.18 via pyenv, the brew extract method also failed, etc.

1

This should work!!!

wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python get-pip.py
pip install virtualenv # This will not work, use below
~/Library/Python/2.7/bin/pip  install virtualenv
~/Library/Python/2.7/bin/virtualenv --python=/usr/bin/python venv_twisted
source venv_twisted/bin/activate
3
  • 2
    There are seven existing answers to this question, including a top-voted, accepted answer with over one hundred fifty votes. Are you certain your solution hasn't already been given? If not, why do you believe your approach improves upon the existing proposals, which have been validated by the community? Offering an explanation is always useful on Stack Overflow, but it's especially important where the question has been resolved to the satisfaction of both the OP and the community. Help readers out by explaining what your answer does different and when it might be preferred. Commented Mar 10, 2022 at 0:28
  • 1
    @JeremyCaney Highly voted answers may become obsolete over time and prompt the need for new, entirely different answers. The "there's already a highly upvoted answer" argument is generally a poor one.
    – awwright
    Commented May 23, 2022 at 23:22
  • @awwright: Reread my critique. It's not that the highly voted answer must be correct. It's that this answer was submitted to a question without any explanation. If the top-voted answer is out-of-date, and this addresses that, then this answer should state that clearly. Commented May 24, 2022 at 0:48
0

I used methods from this page to install Python 2.7 on Mac for a year. But May 2021 I tried most suggestions on this page and they all failed.

Maybe Python 2.7 is getting harder to install or maybe my new macOS Big Sur 11.4 is causing the problem.

I was able to setup a working Python 2.7 environment in this way by reusing the native Python 2.7.16

  • Install pip manually
  • Setup a virtual environment
  • Install dependencies with pip in virtual environment

Here are the install steps:

wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python get-pip.py
pip install virtualenv
~/Library/Python/2.7/bin/pip  install virtualenv
virtualenv --python=/usr/bin/python venv
source venv/bin/activate
1
  • Where does virtualenv get installed using this method? I get command not found: virtualenv although it appears to have been installed somewhere.
    – P A N
    Commented Oct 30, 2021 at 8:18
0

I was getting errors using brew and not able to install.

Error: Installation of python@2 from a GitHub commit URL is unsupported! brew extract python@2 to a stable tap on GitHub instead.

You can direct download python from their site version 2.7.18 and for list of available version click here

1
  • 1
    Even though this is not what this questions is looking for, to my understanding, I am not sure why this answer was -1, since currently this is a solution to the problem to install python2 in mac OSs.
    – Hunter8
    Commented Nov 27, 2022 at 18:51
0

Use case

None of the existing answers really worked for me, so here's my solution in case someone else has a similar use case.

I have python3 installed via homebrew which is symlinked as python and I wanted python2 to exist alongside it without changing anything.

Overview and some notes

  • Compiling from source: At the end of the day, it was easier to compile from source. So this solution assumes you have gcc installed, which you can do via homebrew install gcc

  • Sane dependencies: You will also need zlib and other dependencies installed via brew install openssl bzip2 libffi readline sqlite xz zlib

  • Architecture: I'm on Apple Silicon so I needed the arch command below, but you should be able to omit it if running on x86. If you're also on Apple Silicon, you'll need Rosetta to be available, otherwise install it with /usr/sbin/softwareupdate --install-rosetta --agree-to-license

  • Optimizations: I also think you can also remove the --enable-optimizations flag from ./configure... if you want faster compilation at the expense of not having optimizations, but I haven't tested it.

  • The most important bit is running make altinstall at the end instead of make install, which ensures your existing python is left untouched.

  • Timing consideration: The process will take quite a while to complete even on fast machines. I'm on a M2 Ultra and configure took a few mins whereas make took several minutes (long enough to let me write this whole answer!)

  • About LDFLAGS and CPPFLAGS: These environment variables help the configure script locate necessary libraries for Python features. Setting these ensures your Python build can support secure networking, data compression, and more.

  • Clean Build Environment: Running make clean ensures that any previous compilation attempts are cleared out, providing a clean slate for a successful build.

Downloading and extracting Python 2.7

I suggest cd'ing into some dir like ~/Downloads before running the below

brew install zlib openssl bzip2 libffi readline sqlite xz 
curl -O https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz
tar -xf Python-2.7.18.tar.xz
cd Python-2.7.18

Run the Install Script

Before installing, you need to manually change to a Rosetta shell by typing

arch -x86_64 /bin/zsh

You'll need to do this each time you open a new terminal session and intend to run any part of the installation process under Rosetta on Apple Silicon.

After doing that, you're free to run the install script.

I've pasted this separately from the download script (which you'll only ever need to run once) in case the below fails for some reason:

export LDFLAGS="$LDFLAGS -L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix bzip2)/lib -L$(brew --prefix libffi)/lib -L$(brew --prefix xz)/lib -L$(brew --prefix zlib)/lib"
export CPPFLAGS="$CPPFLAGS -I$(brew --prefix openssl)/include -I$(brew --prefix readline)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix libffi)/include -I$(brew --prefix xz)/include -I$(brew --prefix zlib)/include"
./configure --prefix=/opt/python27 --enable-optimizations
make clean
sudo make altinstall
sudo ln -s /opt/python27/bin/python2.7 /opt/python27/bin/python2
echo 'export PATH="/opt/python27/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

Verification

You can now run:

  • which python2, which should point to /opt/python27/bin/python2
  • python2 --version, which should confirm the installation by showing Python 2.7.18

Installing pip and setuptools

You'll need to install old (and possibly unsafe) versions of pip and setuptools, sorry

sudo chown -R $(`echo whoami`):staff /opt/python27/
curl -O https://files.pythonhosted.org/packages/b2/40/4e00501c204b457f10fe410da0c97537214b2265247bc9a5bc6edd55b9e4/setuptools-44.1.1.zip
curl -O https://files.pythonhosted.org/packages/53/7f/55721ad0501a9076dbc354cc8c63ffc2d6f1ef360f49ad0fbcce19d68538/pip-20.3.4.tar.gz
tar -xf setuptools-44.1.1.zip
tar -xf pip-20.3.4.tar.gz
cd setuptools-44.1.1
python2 setup.py install
cd ../pip-20.3.4
python2 setup.py install
0

You can just download the python installer. https://www.python.org/downloads/release/python-2718/

This works for me.

Not the answer you're looking for? Browse other questions tagged or ask your own question.