1. ホーム
  2. python

[解決済み] Python subprocess.check_output()から出力される例外をキャッチする方法は?

2023-01-24 05:19:42

質問

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の中から得ることができますか?

どのように解決するのですか?

によると 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'])