Python の subprocess.check_output() から例外出力をキャッチするにはどうすればいいですか? 質問する

Python の subprocess.check_output() から例外出力をキャッチするにはどうすればいいですか? 質問する

Python から Bitcoin の支払いを行おうとしています。bash では通常、次のようにします。

bitcoin sendtoaddress <bitcoin address> <amount>

たとえば次のようになります。

bitcoin sendtoaddress 1HoCUcbK9RbVnuaGQwiyaJGGAG6xrTPC9y 1.4214

成功するとトランザクション ID が出力されますが、ビットコイン残高よりも大きい金額を転送しようとすると、次の出力が表示されます。

error: {"code":-4,"message":"Insufficient funds"}

私の Python プログラムでは、次のように支払いを実行しようとしています。

import subprocess

try:
    output = subprocess.check_output(['bitcoin', 'sendtoaddress', address, str(amount)])
except:
    print "Unexpected error:", sys.exc_info()

残高が十分であれば問題なく動作しますが、残高が十分でない場合はsys.exc_info()次のように出力されます:

(<class 'subprocess.CalledProcessError'>, CalledProcessError(), <traceback object at 0x7f339599ac68>)

ただし、コマンドラインで取得したエラーは含まれていません。そこで質問ですが、出力されたエラー ( {"code":-4,"message":"Insufficient funds"}) を Python 内から取得するにはどうすればよいでしょうか?

ベストアンサー1

によるsubprocess.check_output()ドキュメント、エラー時に発生する例外にはoutputエラーの詳細にアクセスするために使用できる属性:

try:
    subprocess.check_output(...)
except subprocess.CalledProcessError as e:
    print(e.output)

その後、この文字列を分析し、モジュールを使用してエラーの詳細を解析できるようになりますjson

if e.output.startswith('error: {'):
    error = json.loads(e.output[7:]) # Skip "error: "
    print(error['code'])
    print(error['message'])

おすすめ記事