Candyコマンドのオプション

candy-pi-lite

#1

CANDY PI Liteにて、candyコマンドから帰ってくるJSONの値を他のプログラム(perl等)で利用しようとしたのですが、標準だと色表示向けのエスケープシーケンスが含まれているかと思います。

このようなエスケープシーケンスが入らないようなオプションはありますか?


#2

ご質問ありがとうございます。
確かにJSON文字列として扱おうとすると余計なものが入ってきてしまいます。candyコマンドにはオプションはないのですが、こちらのStackExchangeの質問への回答から、以下のようにすると余計なものを取り除くことができます。

pi@raspberrypi:~ $ sudo candy apn ls | perl -pe 's/\e\[?.*?[\@-~]//g'
{
  "apns": []
}

Pythonコードの例では、以下のようになります(ファイル名はtest.pyとします)。

import subprocess
import json
candy_apn_ls_cmd = "candy apn ls | perl -pe 's/\e\[?.*?[\@-~]//g'"
candy_apn_ls = subprocess.Popen(candy_apn_ls_cmd, shell=True, stdout=subprocess.PIPE).stdout.read()
print(json.loads(candy_apn_ls))

これをsudo python test.pyとすると、エラーが出ないので結果がオブジェクトとして復元できたことがわかります。
なお、| perl -pe 's/\e\[?.*?[\@-~]//g'の部分をtest.pyから取り除くと、candy apn lsの結果にカラーコードが入っているためJSONのパースに失敗して以下のようにエラーが出てきます。

pi@raspberrypi:~ $ sudo python ./test.py 
Traceback (most recent call last):
  File "./test.py", line 5, in <module>
    print(json.loads(candy_apn_ls))
  File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

$ sudo candy gnss status でのJSON出力
About the CANDY RED category
圏外になった後の通信の復帰について
#3

コマンドラインオプションでエスケープシーケンスなしにはできない、ということでしたら了解です。

ご提示いただいたように、フィルタ処理で実装を進めます。