[python] pyinstaller + 日本語の時の注意点

Pythonでexeを作る時に日本語を扱う場合の注意点など。

pythonのstr <-> unicode 周りの話は 以前の記事で書いたのですが、
.pyでは問題なくなってもpyinstallerにすると上手くいかなくなってしまうパターンの
原因が分からず、長らく職場で日本語死ねば良いのに(‘A`)と悲鳴を上げてたわけですが…
ようやく解決したのでメモをば。

原因は、.py時とpyinstallerでexe化した場合では sys.getdefaultencoding() が変わる事のせいでした。

おう…

※普通はこんなことしないですがわかりやすくサンプルを用意しました。

私は、Maya上での日本語対策用に sitecustomize.py を使用して、デフォルトエンコーディングをutf-8
Pythonファイル自体もutf-8を使用するようにしているため
default encodingは utf-8になります。

そんな私の環境で↑を実行すると、 utf-8 がプリントされて、同じフォルダに save_text.txtが保存されます。

書き込まれる文字は
unicode (元)-> str(dump後) -> unicode(書き込み時)
という風に文字列が変わっています。

codecs.open(~,’w’,’utf-8′) でファイルを開いて書き込んだ場合、
write(str)だったとしても暗黙的にdecode(‘utf-8’)されて、
結果unicodeとしてファイルに書き出されます。

このときの「暗黙的なデコード」時の形式は、default encoding になるので
上のサンプルの場合、 utf-8 になります。
なので、すべてutf-8 で文字列を扱っているためこの場合は特にエラーもなく
実行できてしまいます。

が。
pyinstallerでexeにしたものを実行した場合は、

同じコードですが、default encoding が ascii になってしまってるためエンコードエラーが起きてしまいます。

対策は、暗黙のデコードをしないようにきちんとエンコード形式を指定すること。
↑の場合は encode(~) でわざとstrにしてますがそうではなく unicodeにしてから書き込みをしてあげる

あとは、.py時と挙動を一致させるため

sys.setdefaultencoding(‘utf-8’)

これを一番上に入れてあげればとりあえずOKのようです。

 

…日本語の入出力と decode encodeは概ね理解出来たけど…クソめんどくさいので
次何かツールを作る時はC#で作るかな…

コメントを残す

メールアドレスが公開されることはありません。

*