Как перехватить вывод subprocess.call - PullRequest
0 голосов
/ 22 мая 2018

Я сделал скрипт, который сообщает мне температуру моего 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 = 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

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

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))
0 голосов
/ 22 мая 2018

Вы должны использовать subprocess.check_output, чтобы получить ответ от вашей команды.

Из документов:

subprocess.check_output (args, *, stdin = None, stderr =Нет, shell = False, universal_newlines = False)

Запустить команду с аргументами и вернуть ее вывод в виде байтовой строки.

Использование call дает код возврата:

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

Запустить команду, описанную args.Дождитесь завершения команды, затем верните атрибут кода возврата.

...