Python
mod_wsgi

mod_wsgiで動かす時に、UnicodeDecodeErrorが出てしまう

概要

ファイルを読み込むというPythonコードを動かす際のトラブル。
mod_wsgiでApacheから動作させる際に、ターミナルでは普通に動作していたが、Apacheで動作させるとUnicodeDecodeErrorに遭遇した。
結果的には、ロケールの設定が問題だった。
少しハマったので、備忘録として残す。
(UbuntuのApacheで動かしているためRHEL系だとディレクトリ構成などは若干異なると思います。)

エラー内容

[Thu Jul 06 10:50:28.381851 2017] [wsgi:error] [pid 6935] [hogehoge]     for line in fin:
[Thu Jul 06 10:50:28.381858 2017] [wsgi:error] [pid 6935] [hogehoge]   File "/usr/path/to/python/encodings/ascii.py", line 26, i
n decode
[Thu Jul 06 10:50:28.381862 2017] [wsgi:error] [pid 6935] [hogehoge]     return codecs.ascii_decode(input, self.errors)[0]
[Thu Jul 06 10:50:28.381882 2017] [wsgi:error] [pid 6935] [hogehoge] UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not i
n range(128)

このように、Pythonでよくやるfor line in finとして、日本語が記述されたファイルを読み込もうとするだけで、エラーが発生する。
エラーは、UnicodeDecodeErrorなので文字コード周りでコケていそうということがわかる。

対策

Apacheの設定が原因だった。
システムはLANG="en_US.UTF-8"となっており、ターミナルでデバッグする際は、こちらが適用されている。
Apacheで動作させると、/etc/apache2/envvarsに記載されている環境変数の設定が適用される。
今回の場合は、ここでexport LANG=Cとなっていた。
これを上記のものと揃えてexport LANG="en_US.UTF-8"とすると動作する(コメントには、export LANG/etc/default/localeを読みに行くと書いているがうまく動作しなかった。)

その他

チェックしたこと
- import sys;sys.getdefaultencoding()でutf-8かどうか確認