Switching Python version (3.9 → 3.8) installed by Homebrew

18,205

Solution 1

Well, sometimes it helps to ask the question to find the solution on your own – one of the great things of StackOverflow, by the way.

The hint is in the warning of pipenv: "Your Pipfile requires python_version 3.9".

I simply did

rm Pipfile
rm Pipfile.lock

and then it worked:

pipenv install google-ads

Well, at least pipenv worked correctly with Python 3.8. There is still an issue with google-ads, but that's another story.

Probably it would have been enough to change the Pipfile:

[requires]
python_version = "3.8"

Solution 2

I'm glad you were able to fix the issue your own way, but let me add some advice. Generally speaking, downgrading Python (or really any program) is not usually a supported operation. Upgrading may upgrade dependencies in other packages that are not backwards compatible with older versions of Python or other dependencies. In short, you shouldn't even want to "downgrade" a package, ever.

Instead, you should use multiple independent environments e.g. with virtualenv so that, if ever you need a lower version for some reason, you can replace the entire environment with a new one of lower version (note the subtle difference from "downgrading" because you are using a new environment completely).

Share:
18,205
Ralf Zosel
Author by

Ralf Zosel

Lawyer with passion for the internet

Updated on June 18, 2022

Comments

  • Ralf Zosel
    Ralf Zosel almost 2 years

    It’s a very similar situation like described here, but vice versa. I have Python 3.8 installed via Homebrew and updated that to 3.9:

    % brew list --formula | grep python
    [email protected]
    [email protected]
    

    I want to use Python 3.8 as my default version with python3 command and tried – inspired by this answer – the following:

    brew unlink [email protected]
    brew unlink [email protected]
    brew link [email protected]
    

    The last gave me the following output:

    % brew link [email protected]
    Linking /usr/local/Cellar/[email protected]/3.8.6_2... 
    Error: Could not symlink bin/pip3
    Target /usr/local/bin/pip3
    already exists. You may want to remove it:
      rm '/usr/local/bin/pip3'
    
    To force the link and overwrite all conflicting files:
      brew link --overwrite [email protected]
    
    To list all files that would be deleted:
      brew link --overwrite --dry-run [email protected]
    

    So I did:

    % brew link --overwrite --dry-run [email protected]
    Would remove:
    /usr/local/bin/pip3
    
    If you need to have this software first in your PATH instead consider running:
      echo 'export PATH="/usr/local/opt/[email protected]/bin:$PATH"' >> ~/.zshrc
    

    I thought it would be a good idea to check that first:

    ralf@razbook ~ % brew link --force --dry-run [email protected]
    Would link:
    /usr/local/bin/2to3
    /usr/local/bin/2to3-3.8
    /usr/local/bin/easy_install-3.8
    /usr/local/bin/idle3
    /usr/local/bin/idle3.8
    /usr/local/bin/pip3
    /usr/local/bin/pip3.8
    /usr/local/bin/pydoc3
    /usr/local/bin/pydoc3.8
    /usr/local/bin/python3
    /usr/local/bin/python3-config
    /usr/local/bin/python3.8
    /usr/local/bin/python3.8-config
    /usr/local/bin/wheel3
    /usr/local/share/man/man1/python3.1
    /usr/local/share/man/man1/python3.8.1
    /usr/local/lib/pkgconfig/python-3.8-embed.pc
    /usr/local/lib/pkgconfig/python-3.8.pc
    /usr/local/lib/pkgconfig/python3-embed.pc
    /usr/local/lib/pkgconfig/python3.pc
    /usr/local/Frameworks/Python.framework/Headers
    /usr/local/Frameworks/Python.framework/Python
    /usr/local/Frameworks/Python.framework/Resources
    /usr/local/Frameworks/Python.framework/Versions/3.8
    /usr/local/Frameworks/Python.framework/Versions/Current
    
    If you need to have this software first in your PATH instead consider running:
      echo 'export PATH="/usr/local/opt/[email protected]/bin:$PATH"' >> ~/.zshrc
    

    Sounds good, so let's do it:

     % brew link --force [email protected] 
    Linking /usr/local/Cellar/[email protected]/3.8.6_2... 
    Error: Could not symlink bin/pip3
    Target /usr/local/bin/pip3
    already exists. You may want to remove it:
      rm '/usr/local/bin/pip3'
    
    To force the link and overwrite all conflicting files:
      brew link --overwrite [email protected]
    
    To list all files that would be deleted:
      brew link --overwrite --dry-run [email protected]
    

    Unfortunately I skipped the dry-run:

     % brew link --overwrite [email protected]
    Linking /usr/local/Cellar/[email protected]/3.8.6_2... 25 symlinks created
    
    If you need to have this software first in your PATH instead consider running:
      echo 'export PATH="/usr/local/opt/[email protected]/bin:$PATH"' >> ~/.zshrc
    

    Something seems to have worked:

    % python3 --version
    Python 3.8.6
    % pip3 --version
    pip 20.2.4 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
    

    But still something with pipenv was wrong:

    % pipenv install google-ads
    Warning: Python 3.9 was not found on your system...
    Neither 'pyenv' nor 'asdf' could be found to install Python.
    You can specify specific versions of Python with:
    $ pipenv --python path/to/python
    

    Perhaps I simply should reinstall pipenv?

    % which pipenv
    /usr/local/bin/pipenv
    
    % pip3 uninstall pipenv
    Found existing installation: pipenv 2020.8.13
    Uninstalling pipenv-2020.8.13:
      Would remove:
        /usr/local/bin/pipenv
        /usr/local/bin/pipenv-resolver
        /usr/local/lib/python3.8/site-packages/pipenv-2020.8.13.dist-info/*
        /usr/local/lib/python3.8/site-packages/pipenv/*
    Proceed (y/n)? y
      Successfully uninstalled pipenv-2020.8.13
    
    % pip3 install pipenv
    Collecting pipenv
      Downloading pipenv-2020.11.15-py2.py3-none-any.whl (3.9 MB)
         |████████████████████████████████| 3.9 MB 2.9 MB/s 
    Requirement already satisfied: pip>=18.0 in /usr/local/lib/python3.8/site-packages (from pipenv) (20.2.4)
    Requirement already satisfied: virtualenv in /usr/local/lib/python3.8/site-packages (from pipenv) (20.0.31)
    Requirement already satisfied: setuptools>=36.2.1 in /usr/local/lib/python3.8/site-packages (from pipenv) (50.3.2)
    Requirement already satisfied: certifi in /usr/local/lib/python3.8/site-packages (from pipenv) (2020.6.20)
    Requirement already satisfied: virtualenv-clone>=0.2.5 in /usr/local/lib/python3.8/site-packages (from pipenv) (0.5.4)
    Requirement already satisfied: distlib<1,>=0.3.1 in /usr/local/lib/python3.8/site-packages (from virtualenv->pipenv) (0.3.1)
    Requirement already satisfied: filelock<4,>=3.0.0 in /usr/local/lib/python3.8/site-packages (from virtualenv->pipenv) (3.0.12)
    Collecting six<2,>=1.9.0
      Using cached six-1.15.0-py2.py3-none-any.whl (10 kB)
    Requirement already satisfied: appdirs<2,>=1.4.3 in /usr/local/lib/python3.8/site-packages (from virtualenv->pipenv) (1.4.4)
    Installing collected packages: pipenv, six
    Successfully installed pipenv-2020.11.15 six-1.15.0
    

    But still:

    % pipenv install google-ads
    Warning: Python 3.9 was not found on your system...
    Neither 'pyenv' nor 'asdf' could be found to install Python.
    You can specify specific versions of Python with:
    $ pipenv --python path/to/python
    

    Actually not OK, but let's declare which Python pipenv should use:

    % pipenv --python /usr/local/opt/[email protected]/bin/python3 install google-ads
    Creating a virtualenv for this project...
    Pipfile: /Users/ralf/code/test_snippets/20-12-10_google_ads/Pipfile
    Using /usr/local/opt/[email protected]/bin/python3 (3.8.6) to create virtualenv...
    ⠦ Creating virtual environment...created virtual environment CPython3.8.6.final.0-64 in 362ms
      creator CPython3Posix(dest=/Users/ralf/.local/share/virtualenvs/20-12-10_google_ads-S7vGVfKj, clear=False, global=False)
      seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/ralf/Library/Application Support/virtualenv)
        added seed packages: pip==20.2.4, setuptools==50.3.2, wheel==0.35.1
      activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
    
    ✔ Successfully created virtual environment! 
    Virtualenv location: /Users/ralf/.local/share/virtualenvs/20-12-10_google_ads-S7vGVfKj
    Warning: Your Pipfile requires python_version 3.9, but you are using 3.8.6 (/Users/ralf/.local/share/v/2/bin/python).
      $ pipenv --rm and rebuilding the virtual environment may resolve the issue.
      $ pipenv check will surely fail.
    Warning: Your Pipfile requires python_version 3.9, but you are using 3.8.6 (/Users/ralf/.local/share/v/2/bin/python).
      $ pipenv --rm and rebuilding the virtual environment may resolve the issue.
      $ pipenv check will surely fail.
    Installing google-ads...
    

    pipenv --rm and rebuilding the virtual environment did not help. (I even consider to simply uninstall Python 3.9 and installing Python 3.8 again – but don't know how.)

    Is there a way to persuade pipenv of using Python 3.8?

  • Ralf Zosel
    Ralf Zosel over 3 years
    Thanks for sharing your thoughts. I guess you are right and downgrading is always dangerous, but actually, with pipenv, I am using virtual environments.