rcmdnk's blog
Last update

入門 Python 3

Homebrew 1.5.0のリリース時に予告されていましたが、 brew install pythonでインストールされるpythonがPython2からPython3になりました。

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とすると、pythonpython3python@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/pippip3へのシンボリックリンクとして作られるようになりました。

もちろん、python3pip3と言ったリンクも同時に作られます。

ただ、ここの部分、自分の環境では上手く行かなかったようで、 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などに書いて使ってください、と書いてあります。 ここにpythonpipコマンドがあり、これらはpython2pip2へのシンボリックリンクになっています。

ただし、ここにはpython2pip2と言った名前のリンクは無いので python2と呼ぶことは出来ません。

一方Python3はpythonpython3両方の名前で/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

とするとpython2pip2などのシンボリックリンクを/usr/local/binの下に貼り付ける事ができるので /usr/local/binPATHに入っていれば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だけで良いかちょっと考えながら。)

Sponsored Links
Sponsored Links

« macOS & Chromeで外部アプリでリンクをクリックした際に新しいページなウィンドウが立ち上がる問題 emacs-anywhere: Mac/LinuxでどこでもEmacsを立ち上げてテキスト入力する »

}