如何捕获subprocess.call的输出

时间:2018-05-22 19:16:59

标签: python python-3.x bots raspberry-pi3 discord.py

我制作了一个脚本,告诉我Raspberry Pi 3的温度,但脚本有问题。结果输出是机器人说"你的RPI3 temp目前是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 =真) 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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

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

来自文档:

  

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

     

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

使用call给出了返回码:

  

subprocess.call(args,*,stdin = None,stdout = None,stderr = None,   shell = False)

     

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