Python2は2020年1月1日にサポートを終了しました。Python3は2008年から利用可能ですが、最初はPython 3で利用できなかったライブラリに依存しているため、2から3への変換は遅くなりました。以前のバージョンのPython3はPython 2よりも低速であり、Python2が多くの人にとって非常にうまく機能していたためです。 Python 2の保守終了は、サポートされているリリースがなくなり、Pythonからのバグ修正がなくなることを意味します。 UbuntuやRedHatなどの一部のLinuxディストリビューションは、しばらくの間Python 2をサポートしますが、Python3への移行がより優れたソリューションです。
Python3はPython2と下位互換性があると思いましたか?
100%ではありません。 Python2からPython3への変更は、Python 2のいくつかの問題を「修正」する機会としてとらえられました。その中には、言語全体でUnicodeをより均一に促進し、printがステートメントではなくステートメントであるなどの構文の問題を解決するものがあります。機能。
Python2とPython3の違いのいくつか
print、execなどのいくつかのステートメントが組み込み関数に変更されました。例:
print 'hello world' # valid python 2 not in python 3
print ('hello world') # valid python 3 and later versions of python 2
整数除算も変更されました。例:
print (5 / 2) # in python 2 result is 2 in python 3 result is 2.5
//古い動作をサポートするためにPython3に追加されました
多くの関数は、Python2のascii/ str文字列ではなく、Python3のunicode/bytesを返すようになりました。例:
type (subprocess.checkout_output('cmd')) # returns <class 'bytes'> <class 'bytes'=""> in python 3 vs <type 'str'><type 'str'=""> in python 2
Python 3
type (subprocess.check_output('ls').decode('ascii')) # will result in a <class 'str'><class 'str'=""> in python 3
一部のライブラリが再編成されました。
例えば。 python2ライブラリurllib2は、python 3のurllibに置き換えられました。Python3のUrllibは、urllib.requestやurllib.errorなどのモジュールでも利用できるため、それらをインポートしてpython2と同様の機能を取得できます。
from urllib import urlopen # python 2
from urllib.request import urlopen # python 3
Python2からPython3への変換はほとんど自動的に
pythonスクリプトをpython2からpython3に手動で変換するためにすべての変更を加えることができますが、多くの面倒な作業を行うツールがあります。 2to3は、pipライブラリからインストール可能なパッケージであり、多くのディストリビューションリポジトリで個別のパッケージとしても利用できます。 pip3経由でインストールするには
% pip3 install 2to3
Debian/Ubuntuにインストールするには
% sudo apt install 2to3
Fedora/CentOSにインストールするには
% sudo yum install 2to3
注:pipからインストールすると最新バージョンが取得されますが、ディストリビューションバージョンは少し古い可能性があるため、pipインストールの方が適している場合があります。
2to3の実行
$ 2to3 --help # will provide you the help message from the system
いくつかの興味深いオプション
-l # will provide a list of the fixes available in 2to3. E.g. print, exec, urllib, and others -x # explicitly not run a transformation, use if one of the "fixes" doesn't work for your code base -o # output dir, put transformed files into another location --add-suffix=SUFFIX # put a suffix on converted files --add-suffix='3', will convert .py files to .py3 files -w # overwrite current files with modified files
python 2コード(scripts)のディレクトリとpython 3コード(scripts3)の宛先フォルダがあるとすると、次のように実行できます。変換を実行するコマンドは次のとおりです
% 2to3 scripts -n -w -o scripts3
オプションは次のとおりです
scripts - source dir -n - no backups -w - write-unchanged files, write file even if no changes are required by 2to3 -o - output directory scripts3 - output directory, where the converted scripts are written
このように、元のコードは変更されず、ユーザーはscripts3フォルダー内の変換されたコードを確認し、元のコードも参照できます。
Modernizeは2to3のラッパーです
Python3.1およびPython3.2のサポートに役立つ6つのヘルパー関数を使用する--six-unicodeフラグをサポートすることを除いて、2to3と同様の動作をします。あなたがそれを使うことを奨励する近代化のために追加された説得力のある機能がない限り、私はおそらく2to3を使うでしょう。 Modernizeは、DebianテストやArchなどの一部のディストリビューションでも利用できます。インストールするには
# pip3 install modernize
実行するには
# python-modernize --help
すべきこと
Do conversion in small chunks Do use tools like pylint to help you figure out problematic code, before you convert it Do compare the code before and after the conversion Do use the debugger to validate critical code
してはいけない
Do not overwrite your code with 2to3, recommend a separate directory Do not trust in the tools to do everything correctly
テスト、テスト、テスト
コードをPython2からPython3に変換する方法に関係なく、徹底的にテストする必要があります。ミッションクリティカルなPythonコードの場合は、Pythonデバッガーを使用してコードを1行ずつ実行することをお勧めします。
# python3 -m pdb
次に、n
Python 2は、長く実り多い人生を送った後、死んでしまいました。まだPython2を使用している場合は、Python 3に変換する必要があります。Pythonは、Python2からPython3への変換を支援し、多くの手間を省く2to3のツールを提供します。 2to3は完璧なツールではありませんが、多くの作業を実行し、Python2から3への変換の複雑さを数桁減らすことができます。
- Pythonドキュメントライブラリhttps://docs.python.org/3/library/2to3.htmlの2to3ページ
- ライブラリの最新化https://pypi.org/project/modernize/
- Python2コードをpython.orghttps://docs.python.org/3/howto/pyporting.htmlのPython3ページに移植する