一尘不染

如何从Python subprocess.check_output()捕获异常输出?

python

我正在尝试从Python内部进行比特币付款。在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中获取输出的错误()?

欢迎所有提示!


阅读 240

收藏
2020-12-20

共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'])
2020-12-20