Python2系のサポート期限に備えておきたい事をおさらいしてみる

2020年にサポート期限を迎えるPython2について備えておきたい事について、手元の2系スクリプトに悩みつつも、Python3系への移行及び移行しない場合等も含めておさらいしてみました。
2018.11.26

11月も5週目となり、12月が目前となってきました。2018年も残り僅かです。ここでPythonにおいて思い出しておきたいことがあります。

Python2系のサポート期限は2020年までです。年を越えると残り約1年となります。2系が期限到達と同時に使えなくなるわけではありませんが、保守の面を考慮すると対応を考えておきたい要素の一つだと思います。

状況によって色々な前提もあり、2系から3系への移行が容易くないケースは十分に考えられますが、今回は2to3による、標準ライブラリを主に利用している2系ソースコードの3系移行について触れてみます。

2系と3系の実装差異

ひと目で分かる様な違いから、実行してみないと分からない違いまで存在します。特に、演算子での計算結果が2系と3系で異なる場合等は、単純な実装修正では完了し難いはずです。

バージョン間挙動の違いについては以下の記事にて確認すると、影響の大きさ等も実感しやすいと思います。

2to3とは

Python 2.x のソースコードを読み込み、一連の 変換プログラム を適用して Python 3.x のコードに変換するプログラムです。標準ライブラリはほとんど全てのコードを取り扱うのに十分な変換プログラムを含んでいます。

Python2系とPython3系は標準ライブラリにおいても記述で異なっている点が多くあります。それらをまとめて変換することで大きく作業の効率を図ります。

実行方法

対象となるファイルの変換結果を差分を交えた形で出力しますが、単純な実行ではファイルに保存されません。

% 2to3 main.py

保存する場合は、出力先ディレクトリと元のファイルを引数にて指定します。OSXでの差分確認としてopendiffも併せて利用しています。

% 2to3 --output-dir=p3_dir --write-unchanged-files -n main.py
% opendiff py3_dir/main.py main.py

toxを利用した継続的な確認

2系から3系へ移行検証にはtoxが効率的だと思われます。

% cat << EOF > tox.ini
[tox]
envlist = py27, py36
[testenv]
deps=nose       <br />
commands=nosetests
EOF

setup.pyがなくて動かない等発生した場合は、過去のエントリー「書捨てPythonスクリプト用のバージョン管理テンプレートを作ってみた」等を参考に作成してみてください。

非標準ライブラリへの依存

単純な変換で問題ないケースもあれば、時間を取って再実装に踏み込まなければならないケースもあると思います。

変換する場合に一番抱えやすいと思われる要因として、依存している非標準ライブラリが2系実装となっているというものです。 考えられうる対策としては以下が挙げられます。

  • 類似した3系実装のライブラリに置き換える
  • Forkして3系実装に変えたものを使う

もちろん、外部への依存がなく、処理の変更を加えられる可能性がない場合等は、割り切ってそのまま利用する選択肢もあります。

まとめ

現在のバージョン対応コストを下げる上で取っておきたい対応としては、

  • 今後新規で利用するリソースのバージョンは3系以降にする
  • 2系は古いリソースの実行専用にしておく

等が考えられます。

AWSにおいても、利用しているディストリビューション上でPythonバージョンが古かった場合の対応がAWSドキュメントに掲載されています。該当していて更新したい場合は忘れずに目を通しておきましょう。