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'])