Доморощенный: откат с Python 3.7 до Python 3.6.5.x?

73

brew upgradeМодернизировал систему Python на Python 3.7. К сожалению, Python 3.7 ломает другое программное обеспечение, которое мне нужно использовать (включая, помимо прочего, Ansible). Я думаю, что эти проблемы будут решены в течение следующей недели или около того, но в то же время я хотел бы откат к Python 3.6.5.x

A brew info pythonпоказывает, что предыдущие версии все еще установлены и не очищены:

 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

Различные команды brew linkи brew installкоманды, предлагаемые другими сайтами, не работают:

 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.
глина
источник
10
Для тех, у кого не установлен 3.6.5_1, есть способ получить его через brew: stackoverflow.com/a/51125014/760905
MartyMacGyver
Есть версия питона 3.7.1. Может быть, это решает ваши проблемы.
18:00

Ответы:

82

Если у вас все еще есть предыдущие версии, вы можете просто использовать

brew switch python 3.6.5_1
knilsilooc
источник
1
Дайте мне пару месяцев, я буду готов перейти на 3.7. Когда наступит этот день, как мне отменить эту brew switch ...команду, чтобы вернуться к 3.7?
Питер Бенгтссон
Как это отличается от создания виртуальной среды, подключенной к Python 3.6.5?
JMH
@jmh по какой-то причине мои виртуальные среды 3.6.5 сломались, когда я использовал Homebrew для обновления до 3.7, и я не совсем понял, почему. Конечно, одной из причин, по которой я создал виртуальные среды, было избегание этой проблемы. Переключение назад исправило это. Так как ничего в 3.7 для меня не критично, я сейчас придерживаюсь 3.6.5.
knilsilooc
2
Я понял, что причина вышесказанного в том, что встроенный в Python venv создает символические ссылки, которые прерываются при переходе с Python 3.6.x на 3.7.x. Создание venvs с python3 -m venv --copies venvкопиями файлов Python вместо создания символических ссылок, что предотвращает их разрыв при обновлении версии Python.
knilsilooc
8
Error: python does not have a version "3.6.5_1" in the Cellar. python installed versions: 3.7.0
mrgloom
51

Если у вас нет предыдущей версии для переключения, вы можете установить из предыдущей формулы следующим образом:

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

Обновление 2019-10

- уведомление о зависимостях

В случае, если вы используете --ignore-dependenciesфлаг для преодоления recursive dependencyошибки, он может дать вам следующую ошибку, когда вы делаете pip3 installпосле такой установки:

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

Обходной путь может состоять в том, чтобы сначала установить его зависимости (все, кроме sphinx-doc)

$ brew install pkg-config gdbm openssl readline sqlite xz

Обратите внимание, что это необходимо, opensslа НЕ, openssl@1.1 что является последней зависимостью в homebrew python 3.7.4_1

rinat.io
источник
1
Я думаю, что было бы полезно, если бы вы также объяснили, что brew unlink pythonделает.
августа
Кроме того, вы должны подчеркнуть, что это явно не удаляет вашу текущую версию Python 3.7, и что позже вы можете переключиться на нее (используя, например, то, что предлагается https://apple.stackexchange.com/a/329192/90775 ).
nbro
9
Если вы получаете вопрос о рекурсивной зависимости, это можно обойти, игнорируя зависимости: brew install --ignore-dependencies https://raw.githubusercontent.com/Homebrew/homebrew-core/f2a764ef944b1080be64bd88dca9a1d80130c558/Formula/python.rb.
Эрик Винер
Если --ignore-dependenciesне работает из-за sphinx, закомментируйте зависимость в sphinx и переустановите sphinx, как описано здесь: pyimagesearch.com/2019/01/30/…
thadk
Error: python contains a recursive dependency on itself: python depends on sphinx-doc sphinx-doc depends on python
punkrockpolly
11

Два варианта

Чтобы восстановить ранее установленную версию Python:

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

Используйте, brew info pythonчтобы увидеть, что вы ранее установили

Для чистой установки Python 3.6.5 используйте:

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

Длинный ответ

Есть две формулы для установки Python с Homebrew: python@2и python.
Первый предназначен для 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) для желаемой версии. Вы можете найти идентификатор commint, посмотрев историю для 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.

ePi272314
источник
1
github.com/sashkab/homebrew-python, кажется, делает это
Кузнечик
2

Вы можете временно задним числом homebrew-coreустановить 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

Я не рекомендую постоянно задним числом ставить homebrew-core, так как вы пропустите патчи безопасности, но это полезно для тестирования.

Вы также можете извлечь старые версии формул домашнего варки в свой собственный кран (tap_owner / tap_name), используя brew extractкоманду:

brew extract python tap_owner/tap_name --version=3.6.5
Стивен Питерс
источник
Создание собственного крана или поиск кого-то, кто автоматизировал поддержку 3.6 и других серий с обновлениями, безусловно, лучший путь. Если они делают это правильно, вы можете получить полностью квалифицированную версию и связать ее с brew link python@3.6.x. Хотя pyenvэто еще один вариант.
dragon788
-1

Я не эксперт по этому вопросу, но у меня была такая же проблема. Вот что сработало для меня: $ 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

Бекки
источник