LoginSignup
3
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-04-06

事の始まり

この本のある章で、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なのはどう考えてもデフォルト文字コードが悪い!

3
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
3
4