Posted at

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

More than 1 year has passed since last update.


概要

ファイルを読み込むという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かどうか確認