如何捕获 subprocess.call 的输出

Posted

技术标签:

【中文标题】如何捕获 subprocess.call 的输出【英文标题】:How to capture output of subprocess.call 【发布时间】:2018-11-01 15:41:22 【问题描述】:

我制作了一个脚本,告诉我 Raspberry Pi 3 的温度,但脚本有问题。结果输出是机器人说“您的 RPI3 温度当前为 0”。我的代码有什么问题?

@bot.command(pass_context=True)
async def vcgencmdmeasure_temp(ctx):
    if ctx.message.author.id == "412372079242117123":
        await bot.say("OK....")
        return_code = subprocess.call("vcgencmd measure_temp", shell=True)
        await bot.say("KK done")
        await bot.say("Your RPI3 temp is currently: ".format(return_code))
    else:
        await bot.say("Error user lacks perms(only bot owner can run this)")

编辑:我知道想要运行任何命令。 当前脚本

@bot.command(pass_context=True) async def rpicmd(ctx, *args):

if ctx.message.author.id == "412372079242117123":
    mesg = ''.join(args)
    mesg = str(mesg)
    command_output = subprocess.check_output(mesg, shell=True, universal_newlines=True)
    await bot.say(command_output)
else:
    await bot.say("No noob")

我得到了错误:

raise CommandInvokeError(e) from e
discord.ext.commands.errors.CommandInvokeError: Command raised an 
 exception: CalledProcessError: Command 'vcgencmdmeasure_temp' returned 
  non-zero exit status 12

【问题讨论】:

【参考方案1】:

return_code 会有进程的返回码。当一个进程成功存在(没有错误)时,它返回一个代码0。如果它出错,它会返回一个代码1(或非零值)。如果您想要程序的输出(打印到stdout),这是获得它的一种方法:

p = subprocess.run("vcgencmd measure_temp", shell=True,stdout=subprocess.PIPE)
result = p.stdout.decode()
await bot.say("Your RPI3 temp is currently: ".format(result))

【讨论】:

然后我用 await bot.say(result)? @botbotbotty 是的。我已更新我的答案以匹配您的原始代码。【参考方案2】:

您应该使用subprocess.check_output 从您的命令中获取响应。

来自文档:

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, Universal_newlines=False)

使用参数运行命令并将其输出作为字节字符串返回。

使用call 给出返回码:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, 壳=假)

运行 args 描述的命令。等待命令 完成,然后返回returncode属性。

【讨论】:

以上是关于如何捕获 subprocess.call 的输出的主要内容,如果未能解决你的问题,请参考以下文章

如何在unittest中捕获python子进程stdout

如何防止subprocess.call打印返回代码?

Python:使用 subprocess.call 获取输出,而不是 Popen [重复]

subprocess.call和subprocess.Popen

subprocess.call() 与 GUI (Tkinter) 交互

从Python subprocess.call的输出中的列获取值