Python のエンコーディング

% cat /usr/lib/python2.5/site-packages/sitecustomize.py
import sys
sys.setdefaultencoding('UTF-8')

% cat enc.py
import sys
print >>sys.stderr, 'sys.stdout.encoding:      %s' % sys.stdout.encoding
print >>sys.stderr, 'sys.getdefaultencoding(): %s' % sys.getdefaultencoding()
print unichr(0x3042)


% python enc.py
sys.stdout.encoding:      UTF-8
sys.getdefaultencoding(): UTF-8
あ

% python enc.py | cat
sys.stdout.encoding:      None
sys.getdefaultencoding(): UTF-8
あ

% sudo rm /usr/lib/python2.5/site-packages/sitecustomize.py

% python enc.py
sys.stdout.encoding:      UTF-8
sys.getdefaultencoding(): ascii
あ

% python enc.py | cat
sys.stdout.encoding:      None
sys.getdefaultencoding(): ascii
Traceback (most recent call last):
  File "enc.py", line 4, in <module>
    print unichr(0x3042)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u3042' in position 0: ordinal not in range(128)

なんなんだろうなぁ。これは。Python を使い始めたときは戸惑った記憶が。とりあえず、標準出力のエンコーディングをホストにハードコードするのは避けたいよなぁ。あるひとは EUC-JP で、別の人は UTF-8 な端末で作業するなんてことはあるかもしれないし。なにより、スクリプトがホストの設定に依存するなんてのは気持ち悪い。
そんなこんなで、

import sys, locale, codecs

enc = locale.getpreferredencoding()
sys.stdout = codecs.getwriter(enc)(sys.stdout)
sys.stdin = codecs.getreader(enc)(sys.stdin)

なんてのが best practice なのかなぁ、と勝手に思っているわけなんだけどどうなんでしょ。