rcmdnk's blog

初めてのPython 第2版

先日Homebrewのパッケージの改変が行われ、pythonというFormulaはPython3をインストールするようになり、 /usr/local/bin/pythonpython3へのリンクになっていました。

これがまた変更され、 /usr/local/bin/pythonpython2へのリンクに戻されました。

Sponsored Links

python2 to python3

1.5.0 — Homebrew

以前から予告されていたこととして、3月に入った時に Homebrewのpython Formulaがpython3をインストールするようになりました。

これに伴い、python2[email protected]となり、 Keg-Only(python2などの実行ファイルへのリンクを/usr/local/binなどには自動的には貼らない)になりました。

python2はエイリアスとして残っていたのでbrew install python2は出来ましたが いずれにしろpythonではpython2ではなくpython3をインストールするようになりました。

この時点で/usr/local/binにPATHが通っていると、pythonと呼ぶとpython3が呼ばれることになりますが、

export PATH="/usr/local/opt/[email protected]/libexec/bin:$PATH"

としておけばこのディレクトリにpythonという名前のpython2へのシンボリックリンクがあるため、 pythonでHomebrewの最新python2を呼ぶことは可能でした。

ただ、 システムデフォルトの/usr/bin/pythonはpython2なので /usr/local/bin/pythonがpython3になったことはHomebrew以外にも大きく影響が出ていました。

明示的に自分でPython3を入れる場合はともかく、他のパッケージがpython3に依存していて 気付かないうちに入る場合もあるので、 その場合は、ふとpythonを使ったらpython3が立ち上がったり、

#!/usr/bin/env python

と言ったShebangを使ったPython scriptが動かなくなった、ということが良く起こっていました。

さらに、[email protected]はKeg-Onlyなので、Homebrewで入れたpython2を使うためには 上に書いたようにパスを通すか、

$ brew link --force [email protected]

として、/usr/local/bin/python2のリンクを手動で張ってpython2を呼ぶ必要がありました。

PEP 394 – The “python” Command on Unix-Like Systems

これに関して当然ユーザーから色々と意見がありましたが、 突如PEP (Python Enhancement Proposal) 394が持ち出され、 /usr/local/bin/pythonはpython2に戻されることになりました。

PEP 394 – The “python” Command on Unix-Like Systems Python.org

PEP 394は pythonとしてPython 3を導入するシステムが出始めた2011年頃に出されたものですが、 基本的にpythonはPython 2を呼ぶ様にすることが薦められています。

定期的にチェックが行われていますが、 Python 2.7が2020年位までメンテナンスが続く2020年頃までは Python2が呼ばれる仕様が基本としたい感じです。

これによりHomebrewで入れられる/usr/local/bin/pythonは Python2を指すように戻されました。

Python and PEP 394 - Homebrew - Homebrew

実際に先ほどコミットがマージされたので、 今、brew update && brew upgradeすると [email protected]を入れてた人は

$ /usr/local/bin/python --version
Python 2.7.14

の様にpython 2に変わっているはずです。

現在の状況

HomebrewのpythonというFormulaは引き続きPython3のものになります。

ただし、

$ brew install python

とした場合、/usr/local/bin/python3がインストールされますが、 /usr/local/bin/pythonは作られません。

同様に/usr/local/bin/pip3がインストールされますが、 /usr/local/bin/pipはインストールされません。

python3という名前もエイリアスとしてあるので

$ brew install python3

でも同様のインストールが出来ます。

一方、

$ brew install [email protected]

とすると/usr/local/bin/python2が自動的にインストールされる様になりました。 さらに、/usr/local/bin/pythonも同様にPython 2へのリンクとしてインストールされます。

同様に/usr/local/bin/pip2もインストールされ、 また、/usr/local/bin/pipもpip2へのシンボリックリンクとしてインストールされます。

python2が現在はエイリアスとして[email protected]を指していますが、 @付きのものはKeg-Onlyなものなので そのうちpython2自体がFormulaになり[email protected]は消えるかとりあえずはエイリアスとして残る感じになると思います。

このインストール後の状態としては、 状態は去年の夏ころに/usr/local/bin/pythonがインストールされなくなった時より 前と同じ状態に戻った感じです。

python3をpythonで呼びたい場合

これにより、python3はpythonでは呼べなくなりますが、 pythonで呼びたい場合には以下のPATHを加えることで可能になります。

export PATH=$(brew --prefix)/opt/python3/libexec/bin:$PATH

brew -pprefixは通常/usr/localです。

ここにはpythonpipという名前のシンボリックリンクがpython3やpip3に対して貼られています。

$(brew –prefix)/opt/python$(brew –prefix)/opt/python3と同様のディレクトリへの リンクなのでどちらでも良いですが、 今後もしかするとまたpythonという名前がPython2用にならないとも限らないので python3の方が安全かな、と思います。

(もっと将来的にはpython2も無くなりpython3というエイリアスもなくなるでしょうが、 その時には/usr/local/bin/pythonがpython3になるでしょう。)

Homebrewチームの暴走感

上にも書いたように昨年/usr/local/bin/pythonをインストールしないようになり、 Homebrewでのpython2はpython2と呼ぶか別途パスを設定する必要があるようになりました。

さらに今月に入ってFormulaのpythonをpython3にすると同時に、 /usr/local/bin/pythonをPython3にするという変更を行いました。

これらはHomebrewのチームがPython3主体にしたいという思いから行ってきたことですが、 ちょっと暴走してた感があります。

元々Homebrewのチーム(というか特にリーダーの@MikeMcQuaid)は ユーザーに対して割と好戦的に反論してきています。

特に文句を言ってるわけではなくて、なんでその様な変更が必要になったのですか? といった質問に対してでも いきなり「じゃあ使うな」みたいになってることもしばしば。

How to install python3 without making the python symlink? - Homebrew - Homebrew

ここでは /usr/local/bin/pythonをpython3としてインストールしない方法について聞かれたのが始まりですが、 オプションで出来る様にすることはそれ程難しいことでは無いにも関わらず、 バッサリと出来ないと宣言し、その様なオプションを付けるつもりも無い、と切っています。

その中でPEP 394を指摘されているにも関わらず、「それは知ってるけど、Python3がメジャーバージョンだし自分達流でやってくから」 と言い放ってます。

ただ、多分ここで指摘された時は実は気づいてなかった(もしくは少なくとも他のほとんどの人は真面目に考えてなかった)状態だったのが、 ここでPEP 394を知ってちゃんとfollowすべきだ、となって

Python and PEP 394 - Homebrew - Homebrew

という事になったんだと思います。 が、ここでも

Thank you to everyone who helped with this effort and provided constructive, polite and actionable feedback. No thanks to those who have used this as an excuse to abuse the entirely volunteer run project and maintainers.

なことを言っていて、あくまで文句言ってきたやつは許さん、という全く無意味な余計な一言を加えています。 (今回のpython2の件に関しては一通り関連するものを見てるつもりですが、特にabuseなことをしてる人は居ない中で 敢えてこの文言を付けるのは今までの経緯からだと思いますがちょっと。。。)

最近は、OSSでボランティアでやってやってるんだから余計な口出しをするな、位の雰囲気にもなってきていて ちょっと見ていて辛いところがあります(まあ、主に一人がなんですが。。。)。

Homebrewは便利なツールで広く使われていますし 今後もどんどん便利になっていってほしいとは思いますが、 ちょっと最近この辺の雰囲気が嫌で別のツールがあればな、とすら思うようになっています。

今のところ血気盛んなのが主には一人だけなので大丈夫ですが、 もう一人くらい出てきて、それで対立が起こったら無駄な分裂とかすらできそうな感じです。

一応GitHubの人だったりしますし、あまりにひどいことはしないとは思いますが、 Donateがあったりスポンサーも付いてたりするので お金も動いてますし、おかしなことになっても不思議ではないかも。。。

今回も/usr/local/bin/pythonをPython3にした、ということ自体は それほど問題ない、というか、そういう方針だということであれば良いのだと思いますが、 反対意見や注文に対してただただバッサリ行くのが問題です。

最終的には曖昧なママPEP 394に従うということで戻していますし、その際に追撃も忘れないという。

ちょっと改めてもらえると気分良く使えるのですが。。。

Sponsored Links
Sponsored Links

« emacs-anywhere: Mac/LinuxでどこでもEmacsを立ち上げてテキスト入力する Homebrewでcask upgradeが実装されていた »