Python2の引退に向けて

##はじめに
今年もあと10日ほどになりました。2010年代が終わるという節目であると同時に、Pythonの世界でも一つの時代が終わることになります。長らくサポートされてきたPython2.7が2020年1月1日にサポート終了(EOL: End of Life)となります。つまりそれ以降はバグが見つかっても修正バージョンが出ない。Python2.7が2シリーズの最後となり、Python2は引退することになります。

Python2.7の最初のバージョンが出たのが2010年7月3日だったので9年半に渡って現役を続けました。その頃のPython3はVersion 3.1。そこからバージョンを重ねて3.8まで来ていて、マイナーバージョン数ではPython2を越えました。

Python2の約20年の歴史の中で2.7がその半分を占めるという異常な状態になったのもPython3がPython2と互換性がなく移行に時間がかかったからでした。[PEP-404](https://www.python.org/dev/peps/pep-0404/)で宣言されていたようにPython2.8は出ないことになっていたので、Python2.7のまま引っ張り続けました。実は最初の引退予定は2015年でしたが、2014年になっても全然移行が進んでおらず「こりゃダメだ」ってことでEOLを5年間先延ばししたのでした。

Python3は当初は性能的な問題も有り、私も長らくPython2に留まっていた人の一人です。時間をかけて徐々にそういった問題も解決し、有名どころのライブラリがPython3対応をするようになってようやく人々が移行を始めました。10年かけて引退までこぎ着けた人たちの苦労は想像に難くないですが、例え良いものであっても移行によって得られるベネフィットが移行に伴うコストを越えない限り人々は動かないということを思い知らされます。

Python2のサポートが終了してもすぐに使えなくなるわけではありません。一方でバグやセキュリティ問題があってもアップデートされないソフトウエアを商用で使うわけにも行かないですし、非商用であっても被害を被る可能性があるのは同じなのでPython3への切り替えは待ったなしかと思います。

自分で使うPythonはもうVersion 3にしているよ、という方も多いと思いますが、一つ見落としがちなのが間接的に使っている場合。多くのツールがPythonに依存していて、それらを例えばパッケージマネージャ経由でインストールしている場合、Python2を引っ張ってきてしまう場合があります。例えば、一見関係なさそうなnode.jsとかvimとかもpythonを使っていたりします。そのため、各パッケージマネージャの管理者の人たちはPython2に依存しているパッケージをPython3依存に移行しようと頑張っています。その状況をHomebrewとDebianに関して調べたので書いてみたいと思います。

## Homebrew

Homebrewでは、`python`というパッケージはpython3を指していて、python2は`python@2`というパッケージ名で提供されています。この`python@2`パッケージは年明け早々に消去されるべく[こんな ](https://github.com/Homebrew/homebrew-core/pull/47750)Pull Requestも既に出ていたりします。ただまだこれに依存しているパッケージもあって、それを先に解消しなければならない。その為のIssueが[こちら](https://github.com/Homebrew/homebrew-core/issues/47050)にあるのですが、それを見るとまだ幾つかのパッケージが未対応になっています。

その状況を手元で確認するとこのようになります。

```shell
$ brew uses python@2
git-remote-hg     ipython@5         mysql-utilities   pwntools          terminator
headphones        mkvtomp4          offlineimap       pygobject         volatility
hg-flow           molecule          ooniprobe         redo              vte
```



この中で自分がインストールしているものが含まれているかどうかを知りたければ、`brew uses --installed python@2` をやってみるとわかります。私は `mysql-utilities`がインストールされていました。どうやらアップデートはもうなく、[ここ](https://downloads.mysql.com/archives/utilities/)の案内によると MySQL Shellへの移行が促されているようなのでそうしてみようかと思います。

なお、MacOS標準のpythonは最新のCatalinaでも 2.7のようです。ただし、起動すると「Python2.7を使うのはオススメしないよ！」というメッセージがでてきます。将来的には消されるとのことだけど、次のバージョンが出るまではこのままなのかな。

## Debian

Debianの方でもPython2を削除しようとしています。ただし、Debianは歴史も長くパッケージ数が多いこともあって事態はもっと複雑です。Python2削除によって影響を受けるパッケージはDebianのバグ管理システムに登録されていて `py2removal`というタグが付いていますが（[Bugs tagged py2removal](https://bugs.debian.org/cgi-bin/pkgreport.cgi?tag=py2removal;users=debian-python@lists.debian.org)）、総数は3,443。そのうち解決済みとなっているのが1,960。残りの1,483パッケージがまだ未解決となっています。

利用数が少ないものやアップストリーム（開発元）でメンテナンスがされていないものはバシバシ消去対象になっていて、既に消されているものも多数あります。なので、残っている1,500ほどのパッケージはそこそこ重要なものが含まれています。特に、「serious」（最も深刻）とされているものが600以上あって、これらが解決しないとたぶんpython2は消せない。いつまでかかるのか動向を見守るしかないですね。

未解決のリストをざっと眺めてみると幾つか見知った名前があります。例えば `trac`。これはチケット管理ツールでいわばPython版redmine。だいぶ前に使っていたことがありましたが久しぶりに名前を聞きました。アップストリームをみると今年の8月に新しいバージョン(1.4)が出ていますが、まだpython3対応していない。ロードマップを見ると次の1.6で対応する予定みたいですが全然間に合ってないですね。Tracの開発自体をTrac https://trac.edgewall.org/wiki でやっていますが、やはり古い感じが否めない。Githubでやったらもっと楽なのにと思ったけど、そうするとそもそもこのTracの存在意義がなくなっちゃう(笑)。やはりソフトウエアにも寿命があるんだなと思い知らされます。

あと、それぞれのパッケージメンテナーとのやり取りがバグチケットに載っているのですが、結構激しくバトっていたりします。例えば  [Calibreというパッケージのチケット](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=936270) だと「おまえら全然何もやってねえじゃないか」とか「そういう嘘やFUD(恐怖、不安、疑念)を撒き散らすのはやめろ」とか、結構強い言葉が並んでいたりします。Python2がそのまま使い続けられればすることのない無駄な作業なのでわからないでもないですが、Python2をPython3と並行して長い間残したことの功罪相半ばという感じですね。

## Python2.7の今後

Python2.7は1月以降どうなるのか。なんと実は[PEP-373](https://www.python.org/dev/peps/pep-0373/)にはこの先のリリース予定が載ってます。

- 2.7.18 コードフリーズ … 2020年1月
- 2.7.18 リリース候補 … 2020年4月初旬
- 2.7.18 正式リリース … 2020年4月中旬

あれ、1月で打ち止めじゃなかったっけ⁉と思ったのですが、最後のメンテナンスリリースがもう一度だけあるみたいです。Homebrewとかはもう Python@2をドロップしてしまうので次の 2.7.18 は幻のバージョンになるのかも。



## まとめ

Python2引退に伴うHomebrewとDebianの準備状況を調べてみました。実際にこの後どうなっているのか、見守ってみたいと思います。

なお、引退までのカウントダウンは https://pythonclock.org/ でみることができます。