Как логировать данные subprocess в тг бот

Рейтинг: 0Ответов: 1Опубликовано: 03.05.2023

я запускаю jar файл так:

import subprocess

subprocess.call([java8_path, '-jar', core_path])

и все работает и выводится в консоль логи jar файла, но я не могу реализовать одну вещь:

мне нужно чтобы логи из jar файла не выводились прямо в консоль, а чтобы их отправлял мне тг бот

from aiogram import types

async def send_logs(jar_log_text: str):
    await bot.send_message(0000000, jar_log_text)

но я не знаю потоки и подпоцессы и не понимаю как это сделать, помогите пожалуйста

Ответы

▲ 0

Чтобы просто получить вывод подпроцесса, можно использовать subprocess.check_output, пример:

import subprocess

jar_log_text = subprocess.check_output([java8_path, '-jar', core_path])

Но для асинхронной работы (т.к. у вас aiogram) лучше использовать функции из модуля asyncio (см. https://docs.python.org/3/library/asyncio-subprocess.html):

import asyncio


async def run_something():
    # Ждем запуска процесса
    proc = await asyncio.create_subprocess_exec(
        *[java8_path, '-jar', core_path],
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE,
    )

    # Ждем завершения процесса и получаем все что он вывел
    stdout, stderr = await proc.communicate()
    # в stdout - обычный вывод субпроцесса
    # в stderr - вывод ошибок

    if stdout:
        await bot.send_message(0000000, f'[stdout]\n{stdout.decode("utf-8")}')
    if stderr:
        await bot.send_message(0000000, f'[stderr]\n{stderr.decode("utf-8")}')

Если бот запущен на Windows, то вместо .decode("utf-8") нужно использовать .decode("cp866").