LoginSignup
2
4

More than 5 years have passed since last update.

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

Posted at

概要

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

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4