Homebrew: Rollback von Python 3.7 auf Python 3.6.5.x?

A brew upgradehat mein System Python auf Python 3.7 aktualisiert. Leider bricht Python 3.7 andere Software, die ich verwenden muss (einschließlich, aber nicht beschränkt auf Ansible). Ich gehe davon aus, dass diese Probleme in der nächsten Woche oder so behoben werden, aber in der Zwischenzeit möchte ich auf Python 3.6.5.x zurücksetzen

A brew info pythonzeigt, dass frühere Versionen noch installiert und nicht gelöscht sind:

➜ brew info python
python: stable 3.7.0 (bottled), HEAD
Interpreted, interactive, object-oriented programming language
https://www.python.org/
/usr/local/Cellar/python/3.6.5 (4,825 files, 100.8MB)
  Poured from bottle on 2018-03-31 at 20:21:57
/usr/local/Cellar/python/3.6.5_1 (4,788 files, 99.9MB)
  Poured from bottle on 2018-06-20 at 16:00:26
/usr/local/Cellar/python/3.7.0 (4,869 files, 103.3MB)
  Poured from bottle on 2018-07-01 at 19:30:37
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/python.rb

Verschiedene brew linkund brew installBefehle, die von anderen Seiten vorgeschlagen werden, scheinen nicht zu funktionieren:

➜ brew link python@3.6.5
Error: No such keg: /usr/local/Cellar/python@3.6.5
➜ brew link python@3.6.5_1
Error: No such keg: /usr/local/Cellar/python@3.6.5_1
➜ brew install python@3.6.5
Error: No available formula with the name "python@3.6.5" 
==> Searching for a previously deleted formula (in the last month)...
Error: No previously deleted formula found.
==> Searching for similarly named formulae...
==> Searching local taps...
Error: No similarly named formulae found.
==> Searching taps...
==> Searching taps on GitHub...
Error: No formulae found in taps.
Für diejenigen, die 3.6.5_1 nicht installiert haben, gibt es eine Möglichkeit, es über brew zu bekommen: stackoverflow.com/a/51125014/760905
Es gibt eine Python-Version 3.7.1. vielleicht behebt das deine Probleme.
Für diejenigen, die hier landen und nach einer Möglichkeit suchen, eine beliebige ältere Python-Version zu verwenden, versuchen Sie github.com/pyenv/pyenv (die Sie mit brew installieren können).

Antworten (9)

Wenn Sie noch die Vorgängerversionen zur Verfügung haben, können Sie diese einfach verwenden

brew switch python 3.6.5_1
Geben Sie mir ein paar Monate, bis ich bereit bin, auf 3.7 umzusteigen. Wenn dieser Tag kommt, wie mache ich diesen brew switch ...Befehl rückgängig, um zu 3.7 zurückzukehren?
Wie unterscheidet sich dies vom Erstellen einer virtuellen Umgebung, die an Python 3.6.5 angehängt ist?
@jmh Aus irgendeinem Grund brachen meine virtuellen 3.6.5-Umgebungen zusammen, als ich Homebrew zum Aktualisieren auf 3.7 verwendete, und ich habe nicht ganz herausgefunden, warum. Einer der Gründe, warum ich überhaupt virtuelle Umgebungen erstellt habe, war natürlich, dieses Problem zu vermeiden. Zurückschalten hat es behoben. Da für mich in 3.7 nichts kritisch ist, bleibe ich erstmal bei 3.6.5.
Mir wurde klar, dass der Grund für das Obige darin besteht, dass Pythons eingebautes venv Symlinks erstellt, die beim Wechsel von Python 3.6.x zu 3.7.x unterbrochen werden. Das Erstellen von venvs with python3 -m venv --copies venvkopiert die Python-Dateien, anstatt Symlinks zu erstellen, wodurch verhindert wird, dass sie beim Upgrade Ihrer Python-Version beschädigt werden.
Error: python does not have a version "3.6.5_1" in the Cellar. python installed versions: 3.7.0
Selbstnotiz: Um eine virtuelle Umgebung zu erstellen, verwenden Siepython3 -m pip install virtualenv && python3 -m venv venv_name
Ziehen Sie nach dem Zurücksetzen in Betracht brew pin python, es dort zu belassen. Dadurch wird verhindert, dass Homebrew ein Upgrade durchführt, wenn Sie eine brew upgrade.
Update: HomeBrew hat den switchBefehl entfernt, sodass dies nicht mehr funktioniert. Unter diesem Link finden Sie die Diskussion zum Entfernen der Option

Wenn Sie keine vorherige Version haben, auf die Sie wechseln können, können Sie Python 3.6.5_1 von der vorherigen Formel auf diese Weise installieren:

$ brew unlink python

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

Wenn Sie bekommen:

# --ignore-depeError: python contains a recursive dependency on itself:
  python depends on sphinx-doc
  sphinx-doc depends on python

...dann renne:

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

...anstelle des letzten Befehls.

In diesem Fall erhalten Sie pip3 installnach einer solchen Installation die folgende Fehlermeldung:

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

... dann kann eine Problemumgehung darin bestehen, zuerst die Abhängigkeiten zu installieren (alles außer sphinx-doc)

$ brew install pkg-config gdbm openssl readline sqlite xz

Beachten Sie, dass es benötigt wird opensslund NICHT openssl@1.1 , was eine neueste Abhängigkeit in Homebrew Python 3.7. * ist.

Ich denke, es wäre nützlich, wenn Sie auch erklären, was brew unlink pythonfunktioniert.
Darüber hinaus sollten Sie betonen, dass dies Ihre aktuelle Python 3.7-Version anscheinend nicht entfernt und dass Sie später darauf zurückwechseln können (z. B. unter Verwendung des Vorschlags https://apple.stackexchange.com/a/329192/90775 ).
Wenn Sie ein Problem mit einer rekursiven Abhängigkeit erhalten, kann dies umgangen werden, indem Abhängigkeiten ignoriert werden: brew install --ignore-dependencies https://raw.githubusercontent.com/Homebrew/homebrew-core/f2a764ef944b1080be64bd88dca9a1d80130c558/Formula/python.rb.
Wenn --ignore-dependenciesdies aufgrund von Sphinx nicht funktioniert, kommentieren Sie die Abhängigkeit in Sphinx aus und installieren Sie Sphinx wie hier beschrieben neu: pyimagesearch.com/2019/01/30/…
Error: python contains a recursive dependency on itself: python depends on sphinx-doc sphinx-doc depends on python

Zwei Optionen

So stellen Sie eine zuvor installierte Python-Version wieder her:

brew switch python 3.x.x_x # Ex. 3.6.5_1

Verwenden brew info pythonSie , um anzuzeigen, was Sie zuvor installiert haben

Verwenden Sie für eine Neuinstallation von Python 3.6.5 Folgendes:

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

Lange Antwort

Es gibt zwei Formeln für die Installation von Python mit Homebrew: python@2und python.
Der erste ist für Python 2 und der zweite für Python 3.

Hinweis: Sie können veraltete Antworten im Internet finden, wo es python3als Formelname für die Installation von Python Version 3 erwähnt wird. Jetzt ist es nur noch python!

Standardmäßig können Sie mit diesen Formeln die neueste Version der entsprechenden Hauptversion von Python installieren. Sie können also eine Nebenversion wie 3.6 nicht direkt installieren.

Lösung:

Mit brewkönnen Sie ein Paket über die Adresse der Formel installieren, beispielsweise in einem Git-Repository.

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

Oder speziell für Python 3

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

Die Adresse, die Sie angeben müssen, ist die Adresse zum letzten Commit der Formel (python.rb) für die gewünschte Version. Sie finden die Commint-ID, indem Sie sich den Verlauf für homebrew-core/Formula/python.rb ansehen

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

Python > 3.6.5

Im obigen Link finden Sie keine Formel für eine Version von Python über 3.6.5. Nachdem die Betreuer dieses (offiziellen) Repositorys Python 3.7 veröffentlicht haben, reichen sie nur Updates für das Rezept von Python 3.7 ein.

Wie oben erklärt, haben Sie mit Homebrew nur Python 2 (python@2) und Python 3 (python), es gibt keine explizite Formel für Python 3.6 .

Obwohl diese kleineren Updates in den meisten Fällen und für die meisten Benutzer größtenteils irrelevant sind, werde ich suchen, ob jemand eine explizite Formel für 3.6 erstellt hat.

Für 3.6 habe ich versucht, über die URL zu installieren, und es wurde die Fehlermeldung „Ungültige Verwendung: Die Installation von Python von einer GitHub-Commit-URL wird nicht unterstützt! brew extract pythonstattdessen zu einem stabilen Tap auf GitHub'. Am Ende habe ich die Antwort hier verwendet: stackoverflow.com/a/65308770/975592

Der folgende Schritt Nr. 3: Downgrade von Python 3.7 auf Python 3.6 unter macOS Mojave hier hat für mich funktioniert: https://www.pyimagesearch.com/2019/01/30/macos-mojave-install-tensorflow-and-keras-for-deep -Lernen/

Sie können die Variable vorübergehend zurückdatieren homebrew-coreund so festlegen , dass sie an Ort und Stelle bleibt:HOMEBREW_NO_AUTO_UPDATE

cd `brew --repo homebrew/core`
git checkout f2a764ef944b1080be64bd88dca9a1d80130c558
export HOMEBREW_NO_AUTO_UPDATE=1
brew install python
brew install vim --with-python

Ich empfehle nicht, den Homebrew-Core dauerhaft zurückdatieren, da Sie Sicherheitspatches verpassen, aber es ist nützlich für Testzwecke.

Sie können mit dem folgenden Befehl auch alte Versionen von Homebrew-Formeln in Ihren eigenen Tap (tap_owner/tap_name) extrahieren brew extract:

brew extract python tap_owner/tap_name --version=3.6.5
Machen Sie Ihren eigenen Tap oder finden Sie jemanden, der die Wartung der 3.6 und anderer Serien mit Updates automatisiert hat, ist definitiv der beste Weg. Wenn sie es richtig machen, können Sie eine vollqualifizierte Version haben und sie mit verlinken brew link python@3.6.x. Obwohl pyenves auch eine andere Option ist.

In meinem Fall habe ich mich gegen die Brew-Version entschieden und asdf verwendet , um mehrere Python-Versionen zu verwalten.

Angenommen, Sie haben bereits asdf installiert:

brew unklink python
asdf plugin-add python
asdf install python 3.6.9 && asdf global python 3.6.9

Für alle, die auf dieser Seite landen, ergänzen Sie die obige Antwort von rinat.io: Das Gebräu wurde geändert und das Extrahieren alter Formeln ist ein bisschen mühsam. Beziehen Sie sich auf dieses Problem https://github.com/kelaberetiv/TagUI/issues/635 , um alle OpenSSL-bezogenen Probleme mit pip zu lösen.

Ich bin kein Experte auf diesem Gebiet, hatte aber das gleiche Problem. Das hat bei mir funktioniert:$ brew unlink python $ brew uninstall --ignore-dependencies python3 $ brew uninstall pipenv then from https://www.python.org/downloads/ installed python 3.6.6 $ brew install pipenv

Ich konnte keine richtige Lösung für ein ähnliches Problem von mir finden (wobei vim unerwartet beendet wurde), um schnell auf die vorherige Version von Python zurückzusetzen.

Hier ist der Einzeiler, den ich oft benutze. In diesem Fall wäre es:

Haftungsausschluss: Einige Programme von Brew Manager erfordern aufgrund ihrer eigenen Abhängigkeiten möglicherweise andere Python-Versionen.

brew update && brew install python@3.6.5_1 && brew unlink python@3.7 && brew link python@3.6.5_1 --force && brew cleanup
Das ist mit der neueren Python verknüpft und entfernt die ältere, was das Gegenteil der Frage ist
danke, für den hinweis. mein böser, rechtschreibfehler.