Python3 で、 TypeError: initial_value must be str or None, not bytes が発生する


VPS を 移行して、 Python の version を 2.7 から、3.6 に upgrade しました。 移行時にそれなりにテストはして、問題なさそうには見えたのですが、本日エラーメールを確認したところ、以下のエラーを示すメールがそれなりの数送信されていました。

    picture_IO = StringIO(req.content)
TypeError: initial_value must be str or None, not bytes    

StringIO に import に関しては、import 文を以下の修正で問題ないと思いますが、文字列? byte? の内部処理でエラーになっているようです。

try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO

おそらく、以下の記事の内容が原因なのかと思います。
Python3 + Bottle + Pillow でレスポンスとして画像を返す - BLOG EX MACHINA

StringIO ではなく、ByteIO を使用する形で修正しました。

import six
try:
    from StringIO import StringIO
except ImportError:
    from io import BytesIO    

if six.PY2:
    picture_IO = StringIO(req.content)
else:
    picture_IO = BytesIO(req.content)
picture_IO.seek(0)

Python の Version が 3 であれば、BytesIO を使用する形に書き換えました。
もっといいやり方がありそうに思いますが、とりあえず動くことは確認できました。

以上です。

コメント