py2exeのデフォルトエンコーディング
環境:python2.7 / win32
py2exeでexe化するとデフォルトエンコードが設定されずasciiのままになります。この状態で日本語をprintするとエンコードエラーになり正常に動作しない。いままでsys.stdout=codecs.getwriter('cp932')(sys.stdout)って書いてたけど、もっといい方法を発見。
import sys if hasattr(sys, 'setdefaultencoding'): import locale lang, enc = locale.getdefaultlocale() sys.setdefaultencoding(enc or 'cp932') del sys.setdefaultencoding
通常site.pyが読み込まれるとエンコード設定後はsys.setdefaultencodingは削除されてしまうのですが、py2exeを通すとsite.py自体読み込まれなくなってしまいます。
ということはこれが存在していればまだ未設定ということがわかるし、これを使って設定も可能なのでsite.pyと同じことをしてやればいいってだけですね。やってることはsite.pyとほぼ同じです。あっちはcp932じゃなくてundefinedにしちゃってるけど。
いままで「py2exeにしたときだけasciiになってる」ってことに気づかなくて自分の環境で作ってる間は大丈夫なのに、リリースするとバグ報告がくるという場面がよくありました。これでうまく動作するようになればいいな。