読者です 読者をやめる 読者になる 読者になる

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になってる」ってことに気づかなくて自分の環境で作ってる間は大丈夫なのに、リリースするとバグ報告がくるという場面がよくありました。これでうまく動作するようになればいいな。