- python3 to python
- /usr/local/bin/python
- 他のFormulaの変更(Vimとか)
- brew upgrade時に起こった問題
- bash: [: /usr/local/bin/python:: integer expression expected
- Python2を使うには
- Homebrew-fileの整理
- まとめ
python3 to python
予告されてい通り1、
数時間前にHomebrew-core
のmasterブランチがアップデートされた模様で、
今、brew update
をすると、
$ brew update
Updated 2 taps (homebrew/core, caskroom/cask).
==> New Formulae
python@2
==> Updated Formulae
...
==> Deleted Formulae
python3 ✔
==> Migrating python3 to python
==> Unlinking python3
==> Unlinking python
==> Moving python3 children
==> Linking python
な表示が出ると思います。
python3
というFormulaはなくなって、python@2
というFormulaが追加されています。
また、python
というFormulaはPython2の代わりにPython3をインストールするようになります。
python3
という名前は引き続き使えてbrew install python3
とするとbrew install python
と同じ動作になります。
(brew info python3
とかで簡単に確認出来ます。)
python2
という名前も使えてこれはpython@2
と同じになっています。
アップデート直後brew list
とすると、python
、python3
、python@2
があって、
python3
に関しては恐らく移行スクリプトのバグだと思いますが残ってしまっています。
(次に書く再インストールをすることでpython3
は消えました。)
/usr/local/bin/python
追記: 2018/03/10
再び変更が入って、python2
をインスト−すると/usr/local/bin/python2及び/usr/local/bin/pythonがPython2を呼ぶものとして
インストールされる様になっています。
追記ここまで
これに伴って、/usr/local/bin/pythonが ../Cellar/python/3.6.4_3/bin/python(../Frameworks/Python.framework/Versions/3.6/bin/python3.6) へのシンボリックリンクとして作成される様になります。
すでにpython3
をインストールしている場合はこの辺は自動で行われます。
半年ほど前にpython
をインストールする際、python2
のシンボリックリンクを
python
として/usr/local/binに置くことを辞める様になりました。
なので通常/usr/local/bin/pythonは存在しないはずですが ある場合は自動で消されて置き換わる様になっています。
また、/usr/local/bin/pipもpip3
へのシンボリックリンクとして作られるようになりました。
もちろん、python3
やpip3
と言ったリンクも同時に作られます。
ただ、ここの部分、自分の環境では上手く行かなかったようで、
brew update && brew upgrade
直後にはpip
コマンドもpip3
コマンドもない状態でした。
上のpython3
がlistに残ってる問題と合わせて、
$ brew uninstall --force --ignore-dependencies python
$ brew install python
することで正しくインストールし直してpip
コマンドもインストールされ、
brew list
からもpython3
は消えました。
(--force
を使って一度pythonのディレクトリを綺麗にしたことが問題解決をしたみたいです。)
他のFormulaの変更(Vimとか)
その他のFormulaeのPythonへの依存性などもアップデートが入っています。
VimはこれまでPython3をサポートするためには
$ brew install --with-python3
が必要でしたが、今後は何もフラグを付けないでもPython3をサポートする様になります。 (Python3がインストールされてなければ自動でインストールされる。)
逆にPython2のサポートが欲しい場合には--with-python@2
を与える必要があります。
brew upgrade時に起こった問題
brew update
を行った直後にbrew upgrade
をしてみましたがエラー終了しました。
Mercurialの再インストールでhg
の実行ファイルが無い、みたいなエラーでしたが、
もう一度brew upgrade
をしてみると、
Mercurialは飛ばされて他をインストールして正常終了し、
hg
コマンドもきちんとインストールされてました。謎。
後でもう少しちゃんとログを見てみると、Python3のインストールで
Traceback (most recent call last):
File "setup.py", line 6, in <module>
from setuptools import setup, find_packages
ModuleNotFoundError: No module named 'setuptools'
Warning: The post-install step did not complete successfully
You can try again using `brew postinstall python`
みたいなエラーが出ていました。
python
コマンド自体はインストールされてましたがpip
はインストールされてない状態。
上にも書きましたが、
$ brew uninstall --force --ignore-dependencies python
$ brew install python
でクリーンアップして再インストールするとpip
も正しくインストールされました。
bash: [: /usr/local/bin/python:: integer expression expected
brew
コマンドを使う時、Python3が入っていないと
bash: [: /usr/local/bin/python:: integer expression expected
と言ったエラーが出る様になっています。
python
(Python3)が正しくインストールされているとこのエラーは出ませんが、
インストールしてないと必ず出ます。
なのでこれまでPython3をインストールしてなかった人は出るようになってるのでは?と思います。 (何かしら環境によるかもしれませんが。)
実用的にはそれ程問題ないですが、Pythonのインストールとかには影響がある?ために インストールが上手く行かなかったりしてるのかもしれません。 多分すぐにfixされるとは思いますが。
Python2を使うには
python
コマンドでPython2を使いたい場合
Python2は通常のインストールではpython2
なども/usr/local/bin以下にインストールしない仕様になっています。
インストール時に出てくるKeg情報に従えば
export PATH="/usr/local/opt/python@2/libexec/bin:$PATH"
を.bashrcなどに書いて使ってください、と書いてあります。
ここにpython
やpip
コマンドがあり、これらはpython2
やpip2
へのシンボリックリンクになっています。
ただし、ここにはpython2
やpip2
と言った名前のリンクは無いので
python2
と呼ぶことは出来ません。
一方Python3はpython
、python3
両方の名前で/usr/local/binの下に置かれているので、
上記のPATHを設定した場合には(/usr/local/binには元々PATH
が通ってるとして)
python3
の名前でだけ呼べる状態になります。
/usr/local/bin/pythonが消えてからは
/usr/local/opt/python/libexec/bin
へPATH
を通すとpython
がPython2として使える様になってましたが、
このディレクトリはなくなっている(というか/usr/local/opt/python/はPython3のものになっている)ので上の様に変更する必要があります。
python2
コマンドでPython2を呼びたい場合(特にPython3と共存させる場合)
デフォルトではpython2
へのリンクは貼られませんが、
$ brew link --force python@2
とするとpython2
やpip2
などのシンボリックリンクを/usr/local/binの下に貼り付ける事ができるので
/usr/local/binがPATH
に入っていればpython2
などを使うことが出来るようになります。
これをしてもpython
というリンクがPython2として出来ることはありません。
/usr/local/bin/pythonはPython3のものになります。
Homebrew-fileの整理
Homebrew-fileでリストを管理している場合、
そのままだとpython2
とかが残った状態になってしまうので一度
$ brew file init
しておいた方が良いです。
まとめ
macOS + Homebrew + Pythonを使っている人にとっては結構大きな変更だと思いますが、
上記の様にPython2をpython
としてこれまで通り使うことも可能です。
pip
でインストールしたものなども移行時にきちんと移行されてるようで、
これまでに作った環境はそのまま使えます。
ただ、Homebrewを扱ってる人にとっては今後はPython3が主流、というのを見せつけてる感じです。
問題が起こりそうだな、と思うのは、
Python自体を直接はHomebrewではインストールしないで普段はmacOSデフォルトのPythonを使ってる人などが
VimとかをHomebrewでインストールすると、
Python3もインストールされるのでpython
で呼ぶものがPython3になってしまって混乱することがあるかな、とか。
それからスクリプトのShebangで/usr/bin/env pythonとかを指定してあると Python3が呼ばれることになるので動かないスクリプトが結構出てくる可能性があります。
そういった問題も起こるので/usr/local/bin/pythonは置かないものだと思ってましたが これをPython3へのリンクとして置くのは結構強気な姿勢だな、と思います。
まあmacOSでもLinuxのディストリビューションとかでも 近いうちに/usr/bin/pythonがPython3になる時代が来るのでしょうか?
これを機にとりあえずMacではPython3を使うようにしていきたいと思っています。 (結構Python2でしか使えないスクリプトもあるので両方に対応させるようにするかPython3だけで良いかちょっと考えながら。)