GNU/Linux >> Linux の 問題 >  >> Linux

Python2コードをPython3に変換する

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 を文字列に変換するには、.decode('ascii')オプションを使用します。

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 と入力してスクリプトの次の行に移動し、qと入力してデバッガーを終了します。

結論

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ページに移植する


Linux
  1. ConfigParserインストールエラー– pythonsetup.pyegg_infoがエラーコード1で失敗しました[解決済み]

  2. Bash からの Python モジュールのインポート

  3. サービスが実行されているかどうかを確認する Python コード。

  1. Netstatのソースコード?

  2. ワンライナー対スクリプト?

  3. Java コードをリバース エンジニアリングから保護する

  1. Ubuntu のソース コードから自分で Python をビルドするにはどうすればよいですか?

  2. とは :-!! Cコードで?

  3. Python で C コードを使用できますか?