Как логировать данные subprocess в тг бот
я запускаю 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)
но я не знаю потоки и подпоцессы и не понимаю как это сделать, помогите пожалуйста
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
Чтобы просто получить вывод подпроцесса, можно использовать 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").