search
LoginSignup
5

More than 5 years have passed since last update.

posted at

updated at

Python3のcgiスクリプトで、2バイト文字が使えなくてハマった話 on RaspberryPi3

事の始まり

この本のある章で、Python3を使ったcgiスクリプトを扱います。
せっかくなので研究室のラズパイ3上にWebサーバを建てて、本の通りPython3で書いたcgiスクリプトを動かすことにしてみました。
書籍の中ではPythonコードでhttpサーバを建てていたのですが、あえてApacheを使いたかったので、ちょっと違う方法で挑戦してみることに。
しかし、スクリプトを実行しても画面が真っ白のまま何も映らない。。。500エラーも返って来ませんでした。(ちなみにPyhon2で書いたコードは動く。。。)

エラーログを見てみる

/var/log/apache2/error.log
......
[WWW MMM DD HH:MM:SS.SSSSSS YYYY] [cgi:error] [pid ****] [client 10.26.200.***:57137] AH01215: UnicodeEncodeError: 'ascii' codec can't encode characters in position 369-381: ordinal not in range(128)

どうやら文字エンコーディングの部分で怒られてるっぽい。
デフォルトでutf-8使うんじゃないのか?と思いつつ、とりあえずshebang行にutf-8宣言を追加しました。

test.py
# !/usr/bin/python3
# -*- coding: utf-8 -*-
.......

が、現状は変わらず。

解決法

Apache2のコンフィグに、以下の一行を追加すると動きました。
どうやらPython2系と3系で、エンコードする文字コードの設定を読む場所が違うらしいです。

/etc/apache2/apache2.conf
......
<Directory /var/www/>
        ......
        SetEnv PYTHONIOENCODING utf-8
        ......
</Directory>
......

参考

[Python] Python3.0 で マルチバイト文字を print したらエラーになった

私がPython3でUnicodeEncodeErrorなのはどう考えてもデフォルト文字コードが悪い!

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
What you can do with signing up
5