ラベル mabu の投稿を表示しています。 すべての投稿を表示
ラベル mabu の投稿を表示しています。 すべての投稿を表示

2018年3月22日木曜日

Lumin SDK mabu コマンドで json.decoder.JSONDecodeError: Invalid \escape: line 12 column 37 (char 570) が発生する

Magic Leap が Lumin SDK を公開したとのことでさっそく遊んでいますが、躓いたことがあったので記録しておきます。
ちなみに、 Windows10 x64 環境でやっています。

json.decoder.JSONDecodeError: Invalid \escape: line 12 column 37 (char 570) が発生

コンパイルと実行を試しているところで、こんなエラーがでました。
json.decoder.JSONDecodeError: Invalid \escape: line 12 column 37 (char 570)

なんか json で怒られているのだけど、さっぱりわからず。
そもそも json なんて作ってないし、同ディレクトリに sample.json はあるけれどまず関係ないだろって内容でした。

vswhere.exe が日本語を返している

幸いにも stack trace が出ているので追ってみると、どうやら Visual Studio の環境設定を vswhere.exe から json で取得しており、その項目 description に日本語文字列が入っています。エラーメッセージ(line 12 column 37)から見ても、"個々" の "々" の位置らへんを指しているので、コイツが悪さしていると考えて間違いなさそうでした。

vswhere.exe 実行結果、description 部分

全体

良くわからない時は思い切る

なんか encoding が不正なんだな、と思い調べてみましたが、python ではエンコード問題が多発するようで、関連記事が見つかりまくりました(笑
ただ python を書いたことがないので結局正解がよくわからず、思い切って description の項目を削除するように変更してみました。

msvc.py (638行目の locate 関数)
    @staticmethod
    def locate():
        if HOSTOS == OS_WIN:
            vswhere_file_path = os.path.join(
                os.environ["ProgramFiles(x86)"],
                "Microsoft Visual Studio",
                "Installer",
                "vswhere.exe"
            )

            if os.access(vswhere_file_path, os.F_OK):
                cmd = [
                    vswhere_file_path,
                    "-requires", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
                    "-format", "json",
                ]

                out = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

                if out and out.returncode == 0:
                    json_string = out.stdout.decode("utf-8", "replace") if out.stdout else "[]"

                    # 日本語文字列が入ってくるので、思い切って description を削除
                    import re
                    json_string = re.sub(r'"description".+,', "", json_string)

                    json_data = json.loads(json_string)

こんな感じに。

そうすると、エラーが解消され実行することができました。

めでたし。