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