【Python】2系がサポート終了!3系への移行が必要です!

IT

・Python2系と3系の違いがわからない人
・Python2系を使っている人
・Python3系へ移行したい人

Pythonには2系3系があるのをご存知でしょうか?

他の製品と同じようにバージョンを表しているもので、Python2系からPython3系へバージョンアップが行われました。
普通であれば、大多数が最新版のPython3を使用することになりますが、ちょっとした事情でPythonは2系と3系を両方サポートし続けていく必要があり、このような状況になっているのです。

Python2系がもうすぐサポート切れになることからも一度Pythonを見直しておきましょう。
Python3系への移行方法も紹介していきますよ。

Pythonの歴史

Pythonがどのようにバージョン変化してきたのかを見ていきましょう。

年表から判るように1991年にPython0.9としてコード公開され、3年後の1994年最初のPythonが生まれます。
2000年には後継として、Python2.0が生まれここから2.xxとしてバージョン更新されていきます。

そして、Python3.0がリリースされたのは2008年です。
普通であれば、ここからPythonは3.xxで順に数字があがっていき、Python2.xxは2.6の次は出ないものです。

しかし、Pythonはその通常のバージョンアップ方法ではなく、Python2系は2系でバージョンアップし、Python3系は3系でバージョンアップさせるという2系統並列でとても労力のかかるサポート体制をとったのです。

その理由は、Python3系には大きな問題点として、「Python2.xxとの互換性が無かった」のです。

Python3系の互換性問題

Pythonをはじめようと思った人が最初に疑問を持つ点はこのバージョンの差異についてだと思います。

Pythonって、なぜ2系と3系の2つあるの?
その理由は、実はPython3Python2系まったく互換性の無い言語として作られてしまったからなんです。

通常のバージョンアップであれば、多少の差異が発生するとはいえ、完全に互換性が無いようなバージョンアップは行われません。しかし、Python3は開発コンセプトが「西暦3000年に公開予定の理想のPython」ということで今までのPython2系とも大幅にかけ離れた、理想を追い求めたものになります。そのために、プログラミング言語の心臓とも言える「標準ライブラリ」の中身も変更が加わり、言うなればPython2系とはまったく別のプログラミング言語として完成されたものとなりました。

しかし、ここで問題が起きます。
互換性が無いことでPython2系を使っていた人は以下のような状況になります。

  • 今までPython2系を使っていた人はPython3に移行する差異に互換性が無いことでプログラムを書き直す必要がある。
  • 外部ライブラリでPython3用がないため、そのままの移行がまず不可能。

もはや、Python3に移行することは完全に新規開発と同じ労力がかかるということになります。
であれば、最新版のPython3は使わずPython2系をそのまま使っていこうと考えるのは当然といえば当然でしょう。
この状況からPythonは2系も3系も並行してバージョンアップを行っていく必要が出てきたため、Python3のリリース後の2010年Python2.7のリリースが行われています。

Python2系のサポートが継続されていることもあり、2016年の調査結果ではPython2系からPython3系への移行度合い40%程度とかなり低い状態と判っています。この状態から、元々Python2系は2015年にサポート終了を宣告されていましたが、5年間の延長が行われ2020年にサポート終了に変更されました。

現在では、Python2系から3系へのコンバートが容易にできるようなツールや、外部ライブラリも主要なものはPython3用が公開されていることからかなりの割合でPython3への移行が行われています。2017年1月の調査では75%のユーザーが移行完了とわかっています。

結局、Pythonは2系と3系のどっちを使えばいいの?

Python3系の外部ライブラリが整っていない時は、Python2系での開発が推奨されていました。
しかし、いまや基本的な開発はPython3系へ移行されているため、今後便利な外部ライブラリが公開されるとしたらPython3系となります。またサポートが終了することも大きな要素として、今後はPython3系での開発を推奨します。

むしろ、Python2系を使う理由はもうありません。
今からはじめようという方は迷うことなくPython3系を使いましょう。

Python2系から3系への移行

さて、ではここからが本題です。

Python2系が2020年1月にサポート終了となることから、使用している人はPython3系への移行が必要になります。
もちろん、このままサポートなしでPython2系を使用し続けることも可能ですが、致命的なバグが見つかった場合も新バージョンは出てこないのでバグを内包した状態で使用し続けるというリスクを持つことになりますので極力は移行必須と思っていいでしょう。

Python2系と3系の違い

Python2系と3系には互換性がないということ言い続けてきました。

具体的には何が違うの?

具体的な違いは以下の通りです。
とはいえ、差異はかなり多く挙げきれないので、主な差分だけ列挙します。

差分 Python2系 Python3系
標準ライブラリ Python2体系 Python2系から一部ライブラリの変更
printの関数化 print “Hello World” print(“Hello World”)
文字列型 str型とUnicode方の混在 str型への統一
外部ライブラリ Python2系用ライブラリ Python3系用ライブラリ

基本的にこの表の変更点に関して対応を行うことでPython3へ移行することができます

Python3系への移行(2to3.py)

では具体的にPython3系への移行方法を紹介していきます。

まず、最新のPythonであれば2系にも3系にも標準で搭載されている移行用ツール「2to3.py」を使いましょう。
このツールはPythonで標準でインストールされるように公式が用意してくれているものだけに、プログラミング言語内部の変更点に関しては吸収して変換を行ってくれます。

なので、以下の差分はこのツールを使うだけで基本的に解消が可能です。

  • 標準ライブラリの変換
  • printの関数化
  • 文字列型の変更
  • その他の細かな変更点

外部ライブラリを使用していない人であれば、この段階でもうPython3への移行は完了と言えるでしょう。
後は実際に動かしてみて、エラーが出る箇所があれば個別に潰していくような形になります。

使い方

Pythonの移行用ツール「2to3.py」は使い方も簡単です。

まずは、これから使用する予定のPython3系をもうインストールしてしまいましょう。
インストールしたPython3系にはデフォルトで「2to3.py」が入っているので、それを使用していきます。

今回は使用方法を見せるにあたって、以下のようなPython2系で書いたプログラムを用意しました。
(動かしても意味の無いコードですが、移行ツールの効果を示すためのものです。)

Python2系プログラミング

import httplib
import Cookie
import cookielib
import urllib
import urllib2

print u’2to3 TestCode’
lambda (x, y): x + f(y)

  1. コマンドプロンプトを起動する。
  2. [python <インストールディレクトリ>\Tools\scripts\2to3.py –help]を打ち込みツールがあることを確認する。
    (私の場合だと[D:\ユーザー\AppDate\Local\Programs\Python\Python36]にインストールしました。)
  3. [python <インストールディレクトリ>\Tools\scripts\2to3.py <移行対象のPython2系ファイル>]で変更される内容を確認する。
    (私の場合だと[“D:\ユーザー\AppDate\Local\Programs\Python\Python36\Scripts\Python2.py”]にPython2系で書いたプログラムをおきました。)
    「-」が頭についているのが、Python2系で書かれているので削除される部分です。逆に「+」が付いているのがPython3系での書き方として追加される部分です。
  4. [python <インストールディレクトリ>\Tools\scripts\2to3.py -w <移行対象のPython2系ファイル>]で変更する。
    このとき自動でバックアップファイルも作ってくれるので、安心して実行してください。
  5. 変更後のプログラムをPython3で動かす。
    無事に実行することができました。

Python3系への移行(外部ライブラリ)

Python標準部分の変更点に関しては、「2to3.py」を使うことでさくっと変更することができました。
ただ、一番面倒なのが外部ライブラリの修正です。

外部ライブラリに関しては、対象毎に対処法が異なります。
有名なライブラリだと既に移行を経験した先人が情報を残していたりするので参考にしながら、実施する必要があります。

ざっくりとした流れは以下のようになります。

ポイント
  1. 使っているライブラリのPython3用のライブラリを探す。
  2. pip等のコマンドを使って、ダウンロードする。
  3. 2to3.pyにて標準的な移行が完了した状態で、動かしてみる。
  4. エラーが発生した場合は、都度ひとつずつ潰していく。

エラーが発生した場合などは対応完了までに時間がかかるケースが多いです。
また、一番最悪のケースは使っているライブラリがPython3系対応せずに更新がとまっている場合です。
この場合は、他の類似した外部ライブラリを探し出してプログラミングを改修する必要が出てきます。

どちらにせよ外部ライブラリの移行はかなり面倒です。
がんばって先人を捜し当てるのが近道です。

まとめ

Python2系のサポート終了の話しがあったので、Pythonの歴史を振り返ってみたり、移行の方法をまとめてみたりしました。

そもそもなぜPythonは2系と3系に分かれているのかをご存じない方もいらっしゃったのではないでしょうか?
これからPythonを使ってみようと思っている方は、今でもWeb上のドキュメントはPython2系や3系の情報が入り乱れています。

自身が使っているPythonの系統の話しなのか、正確に判断して情報取得をしないとエラーばかり吐き出すプログラムが出来上がりかねないので、
少し歴史を呼んでみていただけると判りやすくなるかなと思います。

こらからの時代はPython3系がメインとなりますが、Python2系が完全になくなるのはもう少し先になると思います。
それまでは、どちらもある程度は話せた方が武器になるのではないでしょうか?

参考にしていただければ幸いです。

コメント

タイトルとURLをコピーしました