Python のスクリプトをPerlで修正する。Python2をPython3対応にするプチ事例

PythonソースコードをPerlでさくっと修正してみる

新規にターミナル(端末)。CTRL+ALT+T

2to3 という、 「Python 2.x のソースコードを読み込み、一連の 変換プログラム を適用して Python 3.x のコードに変換するプログラム」がありますので、本来の目的用ではなく、Perlのワンライナー活用例です。

元のファイル、python000.py Python2用 3行のファイル。

# coding: utf-8
print "パイソン世界2から3への代表的な例::2to3が用意されている\n覚えておくといいかも。"

exit()

実行

$ python2 python000.py
パイソン世界2から3への代表的な例::2to3が用意されている
覚えておくといいかも。

Python3で実行しようとすると怒られる。
$ python3 python000.py
                                          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print

なるほど、printの扱いが変わったのですね。これを修正します。修正の仕方も教えてくれる親切Pythonです。

$ perl -wlpe 's/\b(print)\b.*\"(.*)\"/$1 ("$2")/;s/\# coding: utf-8//' ./python000.py

1)プリント行を()で囲む仕様変更。
2) # coding: utf-8 は当方では不要なので削除する。Windows環境では必要なのかも。UTF-8でしか書かないし、IOは全部UTF-8なので。

まとめて実行、1ライナーで修正して保存、そのまま実行
perl -wlpe 's/\b(print)\b.*\"(.*)\"/$1 ("$2")/;s/\# coding: utf-8//' ./python000.py | tee python003.py && echo "終 実行"; python3 python003.py 
print ("パイソン世界2から3への代表的な例::2to3が用意されている\n覚えておくといいかも。")
exit()
終 実行
パイソン世界2から3への代表的な例::2to3が用意されている
覚えておくといいかも。

$ python3 python003.py

としても当然同じなので、これでOK。

まとめ::結局bash上の使い方事例なのです

perl -wlpe 's/\b(print)\b.*\"(.*)\"/$1 ("$2")/;s/\# coding: utf-8//' ./python000.py |\
 tee python003.py \ 
 && echo "終 実行";\
 python3 python003.py 
パイプ、接続をばらして説明すると
1行目、PerlでPrintする内容をキャプチャしておいて、Python3仕様に変換。不要なUTF-8行削除
2行目、Tee で結果(Python3で動く内容)を出力しつつ新たなファイル(python003.py)に保存
3行目、作業が終わった目印を出力して(冗長)
4行目で、Python3で新規に生成されたスクリプトファイル(python003.py)を引数として実行
こういう流れですね。teeはなくても困らないけれど、ないとめんどくさいコマンドかなと思います。結局便利ですね。