MacでHomebrewによってソフトウェアを管理している人は多いと思いますが、
先日python
のインストール方法について変更がありました。
これまでpython
はPython 2のバイナリを/usr/local/bin/pythonとしてインストールしていましたが、
これが/usr/local/bin/python2になっています。
python to python2
Homebrewにはpython
とpython3
というFormulaがあり、
前者はPython 2、後者がPython 3の最新版をインストールする様になっています。
以前はpython
をインストールすると/usr/local/bin/pythonが、
python3
をインストールすると/usr/local/bin/python3が
インストールされる様になっていました。(それぞれpython2/python3へのリンクが貼られる。)
これが7月14日の変更でpython
をインストールした場合、
/usr/local/bin/pythonではなく/usr/local/bin/python2という
リンク名になる様になりました。
homebrew-core/python.rb at master · Homebrew/homebrew-cor: https://github.com/Homebrew/homebrew-core/blob/master/Formula/python.rb
同様に/usr/local/bin/pipも /usr/local/bin/pip2になっています。
もし14日以降に一度でもbrew update && brew upgrade
を行っているとしたら、
Homebrewでpython
をインストールしてパスも正しく/usr/local/binに通している場合でも、
試しにwhich python
してみると
$ which python
/usr/bin/python
の様にシステムデフォルトのpython
が見つかると思います。
/usr/local/bin/pythonが見つかったらまだ古い状態です。
システムデフォルトでPython 2がインストールされているので
普通にpython
を使っているだけだとなかなか気づかないと思いますが、
pip
の方はシステムデフォルトでは入ってないので
Homebrewでのみ使っている場合、突然bash: pip: command not found
と出て
戸惑う人もいるかもしれません。
これまで通りpython
/pip
を使いたい場合
このままだとHomebrewで入れたPython 2を使いたい場合、
python2
として使わなくてはいけなくなり、
スクリプトとかでpython
/pip
を使っている場合
書き換えるか仕方なくシステムデフォルトを使うかになってしまいます。
これまで通りpython
やpip
を使いたい場合は
export PATH="/usr/local/opt/python/libexec/bin:$PATH"
の様にパスを通すと使う事が出来ます。
(このbin
ディレクトリに同じpython2
へのシンボリックリンクがpython
としてある。)
Shebangとかで/usr/local/bin/pythonを指定してる場合は 何にしろ駄目ですが。
$ ln -s /usr/local/bin/python2 /usr/local/bin/python
とか無理やり自分でリンクを作るてもありますが、 あまり良くないので、 Shebangに関しては
#!/usr/bin/env python
の様に直接ではなく使えるpython
を呼べる様にしておいた方が良いです。
(bash
とかも同じ。)
システムデフォルトとHomebrew版の違い
macOSではデフォルトでもPythonがインストール(/usr/bin/python)されています。
macOS Sierraではそこそこ新しい2.7.10がインストールされています。
Homebrewでインストールすると現在は2.7.13です。
ビルドオプションが多少違っていてconfigureオプションを見ると 以下の様な違いがあります。
$ /usr/bin/python
Python 2.7.10 (default, Feb 7 2017, 00:08:15)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sysconfig
>>> print sysconfig.get_config_vars()["CONFIG_ARGS"]
'--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--disable-dependency-tracking' '--enable-ipv6' '--with-system-expat' '--with-threads' '--enable-framework=/System/Library/Frameworks' '--enable-toolbox-glue' '--with-system-ffi' 'CC=cc' 'CFLAGS=-arch x86_64 -arch i386 -g -Os -pipe -fno-common -fno-strict-aliasing -fwrapv -DENABLE_DTRACE -DMACOSX -DNDEBUG -Wall -Wstrict-prototypes -Wshorten-64-to-32' 'LDFLAGS=-arch x86_64 -arch i386 -Wl,-F.'
$ /usr/local/bin/python2
Python 2.7.13 (default, Jul 19 2017, 03:04:10)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sysconfig
>>> print sysconfig.get_config_vars()["CONFIG_ARGS"]
'--prefix=/usr/local/opt/python' '--enable-ipv6' '--datarootdir=/usr/local/opt/python/share' '--datadir=/usr/local/opt/python/share' '--enable-framework=/usr/local/opt/python/Frameworks' '--without-ensurepip' '--without-gcc' 'MACOSX_DEPLOYMENT_TARGET=10.12' 'CFLAGS=-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers' 'LDFLAGS=-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk' 'CPPFLAGS=-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include' 'CC=clang' 'PKG_CONFIG_PATH=/usr/local/opt/sqlite/lib/pkgconfig:/usr/local/opt/openssl/lib/pkgconfig' 'PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig:/usr/local/Homebrew/Library/Homebrew/os/mac/pkgconfig/10.12'
Homebrew版は何もオプション無しにbrew install python
でインストールしています。
Homebrew版の方はopensslなどもHomebrew版の最新のものを使っています。
通常使う限りはシステムのものでも全く問題ないとは思いますが、 Homebrewで簡単に入れられるのであれば最新のを入れておいて損はないと思います。
まあ、その辺の違いでどうこうしている場合には
virtualenv
(venv
)やpyenv
とか使ってバージョン管理しながら作業しているかと思いますが。
なんでこんなことになっているのか
今回の変更は結構影響が大きい変更だと思いますが
これに踏み切ったのはそもそもpython
のデフォルトとしてPython 2で良いのか、という
様なところみたいです。
python: stop shadowing system python. by MikeMcQuaid · Pull Request #14408 · Homebrew/homebrew-core
Pythonでは現在Python 2とPython 3があって 未だにPython 2も広く使われています。
というよりも多くのシステムで予めインストールされている
PythonはPython 2ですし、
ほとんどのパッケージマネージャーでpython
としてインストールするものは
Python 2です。
Python 2がまだ広く使われているのは あまりに多く使われていて互換性の無いPython 3をシステムのデフォルトとして 採用したりすると解決しなくてはいけない問題が多すぎるからだと思いますが、 基本的にはPython 3へ移行していくべきだとは思います。
なので今後Pythonを勉強し始めようとか言う場合にはPython 3をやった方が良いわけですが、
上のIssueでもその辺の所でpython
といった場合にPython 2で良いのか、と言った議論になってます。
かと言ってまだPython 3をpython
に当ててしまうのはやりすぎです。少なくともmacOSのデフォルトpython
がPython 2のうちは。
色々議論があったようですが、とりあえずFormulaとしてはpython
を現状のままPython 2のインストール用にして、
その代わり/usr/local/binにはpython2
のリンクを置く様になったようです。
これまで通りpython
で呼びたい場合は上に書いたとおりPATHを通す様に、と。
python3
に関しては以前のままpython3
をインストールします。
ということでちょっと気づきにくいところですがそれなりに大きな影響がある変更でした。
Python 3への移行はなかなかどうなるんだろう、というところですが、
python
と呼んだら当たり前の様にPython 3が呼ばれる時代はいつくるのでしょうか?