知っている人には何を今更な話なのですが、初心者がAzure Functionsを使って、FastAPIでAPIを初めて立てた経験談の一つです。
cp932' codec can't encode character のようなエラーが出たらprint文を疑え
Azure FunctionsにFastAPIを使った関数をデプロイしようとするとき、Azure Functions Core Toolsを入れて、まずはローカルで func start
して動かすと思います。FastAPIを普通にローカルで動かす場合は uvicorn main:app --reload
を使うことが多いと思いますが、func start
で動かしてみると、uvicornの時には出なかったエラーが出るようになります。
その代表例が、cp932' codec can't encode character というエラーです。
これはどういうことかというと、Azure Functions Core Toolsの環境下では、コンソールの文字コードはcp932というものになっています。これはUTF-8とは違う文字コードで、例えば絵文字などは表示出来ません。なのに、絵文字が出てくると、このエラーが出て「取り扱えない文字が入っているんだけど!」と怒られることになります。
私はFastAPIからOpenAI APIを呼び出す関数を作っていたのですが、OpenAIからの返事には当然絵文字などが含まれることがあり、それをprint(openai_response)
のような形でprintデバッグしていたから発生したエラーでした。
printをやめてloggingを使うようにしたら、出なくなりました。
uvicornを使っていたときは、手元の環境のコンソール(私の場合はWindows11のPowerShell 7)の文字コードが適用されるので、uvicornでは出なかったエラーがfunc startでは出るようになったということ……と理解しました。
printデバッグからの卒業
初心者が一番はじめに覚えるのはprint()だと思うので、処理を追うのにどうしてもprintを使ってしまいがちだと思います。私もずっとそうでした。この機会に、import loggingしてloggingを使うようにすることにしました。
ちなみにこのことは、ChatGPTに聞いたら教えてくれました。ChatGPT、本当に頼りになる…!