rcmdnk's blog

みんなのPython 第4版

MacでHomebrewによってソフトウェアを管理している人は多いと思いますが、 先日pythonのインストール方法について変更がありました。

これまでpythonはPython 2のバイナリを/usr/local/bin/pythonとしてインストールしていましたが、 これが/usr/local/bin/python2になっています。

Sponsored Links

python to python2

Homebrewにはpythonpython3という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-core

同様に/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を使っている場合 書き換えるか仕方なくシステムデフォルトを使うかになってしまいます。

これまで通りpythonpipを使いたい場合は

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が呼ばれる時代はいつくるのでしょうか?

Sponsored Links
Sponsored Links

« MacでFinderの小さな表示が残ってしまう問題 Homebrewで直接インストールしたか依存関係でインストールされたか確認出来る様になった »