ablog

不器用で落着きのない技術者のメモ

AWS CLI でEMRクラスターのリスト表示で "'ascii' codec can't encode characters in position 1-7: ordinal not in range(128)" と怒られる

事象

  • AWS CLI を実行すると、"'ascii' codec can't encode characters in position 1-7: ordinal not in range(128)" と怒られる。
% aws emr list-clusters
{
    "Clusters": [
        {
            "Status": {
                "Timeline": {
                    "ReadyDateTime": 1512532909.567,
                    "CreationDateTime": 1512532287.771,
                    "EndDateTime": 1512537171.682
                },
                "State": "TERMINATED",
                "StateChangeReason": {
                    "Message": "Terminated by user request",
                    "Code": "USER_REQUEST"
                }
            },
            "NormalizedInstanceHours": 48,
            "Id": "j-1PM1S2K26V0K",
            "Name":
'ascii' codec can't encode characters in position 1-7: ordinal not in range(128)
% echo $LANG
C

原因

  • 標準出力する内容にマルチバイト文字が含まれるが、環境変数 LANG に C がセットされているため、ascii で標準出力しようとしている。

一方でf.writeでは「文字コードの指定ないからようわからん。asciiでいいやろ。」と考えasciiに変換しようとするのですが、当然日本語には対応できずエラーとなります。

Python2における文字列「文字型」と「ユニコード型」についてザックリとまとめた - 小さな星がほらひとつ

解決策

% export LANG=en_US.UTF-8
% aws emr list-clusters