Как перенаправить вывод одной программы на другую?

У меня бот на пайтоне через telebot. Чтобы бот смог одновременно и манипулировать уведомлениями, и присылать их, через subprocess.Popen я запускаю параллельно 2 файл, отправляющий уведомления.

Вот код основной части бота:

# -*- coding: utf-8 -*-
import telebot
import time
import json
import subprocess

from telebot import types, TeleBot
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton
from datetime import datetime
from subprocess import PIPE

bot = telebot.TeleBot('')

with open("notifications.json") as file:
    data = json.load(file)

last_message = ''
UTC = 0
n = 0
formatted_time = ''
noif_time = ""
commands = ('new_notification', 'delete_notification', 'set UTC')
del_list = ''
period = 0


subprocess.Popen(args=["start","python","messageScript.py"],shell=True,stdout=PIPE)


def isMessageTime(mess):
    try:
        if len(mess) == 5 and int(mess[:1]) < 24 and mess[2] == ':' and int(mess[3:]) < 60:
            return True
        else:
            return False
    except ValueError:
        return False


def isMessageInterval(mess):
    if len(mess) == 11:
        if isMessageTime(mess[:5]) and mess[5] == '-' and isMessageTime(mess[6:]): return True
    else:
        return False


def setToNormal(time):
    if type(time) == int:
        if time < 10:
            return '0' + str(time)
        else:
            return time
    else:
        if ':' in time:
            return '0' + time[0]
        else:
            return time


def listToInterval(time_list):
    if len(time_list) < 3:
        return ','.join(time_list)
    else:
        return f'{time_list[0]}-{time_list[-1]}'


def setNotifications(id_user, name, time, period):
    time_list = []
    with open("notifications.json") as file:
        data = json.load(file)
    if isMessageInterval(time):
        time1 = int(time[:2]) * 60 + int(time[3:5])  # получаем кол-во минут
        time2 = int(time[6:8]) * 60 + int(time[9:])
        time_list.append(f'{setToNormal((time1 // 60) % 24)}:{setToNormal(time1 % 60)}:00')
        while time1 + period <= time2:
            time1 = time1 + period
            time_list.append(f'{setToNormal((time1 // 60) % 24)}:{setToNormal(time1 % 60)}:00')
        try:
            data[str(id_user)].append({"name":name,"time": time_list})
        except KeyError:
            data.update({str(id_user): [{"name":name,"time": time_list}]})
    elif isMessageTime:
        time_list.append(f'{setToNormal(time[:2])}:{setToNormal(time[3:])}:00')
        try:
            data[str(id_user)].append({"name":name,"time": time_list})
        except KeyError:
            data.update({str(id_user): [{"name":name,"time": time_list}]})
    with open("notifications.json", 'w') as file:
        json.dump(data, file, indent=2)


def getUTC(user_id):
    with open("notifications.json") as file:
        data = json.load(file)
    try:
        if data['UTC'].get(str(user_id)) is None:
            return 0
        else:
            return data['UTC'].get(str(user_id))
    except KeyError:
        return 0


def plusUTC(time, id_user, modificator=1):
    UTC = modificator * getUTC(str(id_user))
    if isMessageTime(time):
        return f'{setToNormal(((1440 + int(time[:2]) * 60 + int(time[3:]) + UTC) // 60) % 24)}:{setToNormal((1440 + int(time[:2]) * 60 + int(time[3:]) + UTC) % 60)}'
    if isMessageInterval(time):
        return (
            f'{setToNormal(((1440 + int(time[:2]) * 60 + int(time[3:5]) + UTC) // 60) % 24)}:{setToNormal((1440 + int(time[6:8]) * 60 + int(time[9:]) + UTC) % 60)}'
            f'-{setToNormal(((1440 + int(time[6:8]) * 60 + int(time[9:]) + UTC) // 60) % 24)}:{setToNormal((1440 + int(time[6:8]) * 60 + int(time[9:]) + UTC) % 60)}')


def cutTime(time):
    cut_time = []
    for i in range(len(time)):
        cut_time.append(time[i][:-3])
    return cut_time

@bot.message_handler(commands=["start", "menu"])
def start(message):
    markup = types.InlineKeyboardMarkup()
    button_keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn1 = types.InlineKeyboardButton(text="Создать напоминание", callback_data='new_notification')
    btn2 = types.InlineKeyboardButton(text="Удалить напоминание", callback_data='delete_notification')
    btn3 = types.InlineKeyboardButton(text="Задать часовой пояс", callback_data='set UTC')
    menu_button = types.KeyboardButton('Меню')
    button_keyboard.add(menu_button)
    markup.add(btn1, btn2, btn3)

    bot.send_message(message.chat.id,
                     "Привет, я бот-помощник, созданный для напоминаний!\nЗадай часовой пояс и создай напоминание",
                     reply_markup=markup)
    bot.send_message(message.chat.id, "Если что, обращайся в любой момент!", reply_markup=button_keyboard)


@bot.callback_query_handler(func=lambda call: call.data in commands)
def callback_inline(call):
    if call.message:
        global last_message, n, formatted_time, noif_time, UTC, del_list
        if call.data == 'new_notification':  # Создаем напоминание
            bot.send_message(call.message.chat.id,
                             'Напиши время,в которое будет приходить сообщение.\nЕсли нужно чтобы оно приходило в интервале, напиши время через "-"\n Формат - Час:минута',
                             parse_mode='HTML')
            last_message = 'Создать напоминание'

        if call.data == 'set UTC':
            bot.send_message(call.message.chat.id, 'Введи свое текущее время', parse_mode='HTML')
            last_message = 'Часовой пояс'

        if call.data == 'delete_notification':
            with open("notifications.json") as file:
                data = json.load(file)
            try:
                if len(str(data[str(call.message.chat.id)]))<=2:
                    bot.send_message(call.message.chat.id, 'Нет уведомлений', parse_mode='HTML')
                else:
                    del_list = ''
                    for i in range(len(data[str(call.message.chat.id)])):
                        del_list += (f'{i + 1}. Текст: {data[str(call.message.chat.id)][i]["name"]} ;'
                                     f' Время: {plusUTC(listToInterval(cutTime(data[str(call.message.chat.id)][i]["time"])), call.message.chat.id, -1)}\n')
                    bot.send_message(call.message.chat.id, f'{del_list}\nВыбери уведомление, которое хочешь удалить',
                                     parse_mode='HTML')
                    last_message = 'Вывод уведомлений'
            except KeyError:
                bot.send_message(call.message.chat.id, 'Нет уведомлений', parse_mode='HTML')


@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    global last_message, n, formatted_time, noif_time, UTC, del_list,period
    if last_message == 'Создать напоминание':
        if isMessageTime(message.text):
            bot.send_message(message.from_user.id, 'Время напоминания введено успешно', parse_mode='HTML')
            last_message = 'Задано время'
            noif_time = plusUTC(message.text, message.from_user.id)

        if isMessageInterval(message.text):
            bot.send_message(message.from_user.id,
                             'Отлично, теперь введи частоту отправки уведомлений,она указывается в минутах',
                             parse_mode='HTML')
            noif_time = plusUTC(message.text, message.from_user.id)
            last_message = message.text

        if isMessageInterval(message.text) == False and isMessageTime(
                message.text) == False and last_message != message.text:
            bot.send_message(message.from_user.id, 'Ошибка ввода: сообщение не является временем',
                             parse_mode='HTML')

    elif isMessageInterval(last_message):
        last_message = 'Задано время'

    if last_message == 'Задано время':
        if not(isMessageTime(message.text)):
            try:
                period=int(message.text)
                bot.send_message(message.from_user.id, 'Введи текст напоминания', parse_mode='HTML')
                last_message = 'Создана задача'
            except ValueError:
                bot.send_message(message.from_user.id, 'Некорректный период', parse_mode='HTML')
        else:
            bot.send_message(message.from_user.id, 'Введи текст напоминания', parse_mode='HTML')
            last_message = 'Создана задача'

    elif last_message == 'Создана задача':
        name = message.text
        bot.send_message(message.from_user.id, 'Отлично, напоминание создано', parse_mode='HTML')
        setNotifications(message.from_user.id, name, noif_time, period)
        last_message = ''

    if isMessageTime(message.text) and last_message == 'Часовой пояс':
        current_time = datetime.now().strftime("%H:%M")
        UTC = int(message.text[:2]) * 60 + int(message.text[3:]) - int(current_time[:2]) * 60 - int(current_time[3:])
        
        with open("notifications.json") as file:
            data = json.load(file)
        data['UTC'].update({str(message.from_user.id): UTC})
        with open("notifications.json", 'w') as file:
            json.dump(data, file, indent=2)
        last_message = 'Задан часовой пояс'

    if isMessageTime(message.text) == False and last_message == 'Часовой пояс':
        bot.send_message(message.from_user.id,
                         'Ты что-то неправильно ввел(а)... Убедить в правильности написания времени.\nФормат:24 часа, например 12 часов ночи нужно писать как "00:00" ',
                         parse_mode='HTML')

    if last_message == 'Задан часовой пояс':
        bot.send_message(message.from_user.id, 'Отлично, часовой пояс задан', parse_mode='HTML')

    if last_message == 'Вывод уведомлений':
        try:
            if int(message.text) < 0 or int(message.text) > len(del_list):
                bot.send_message(message.from_user.id, 'Введи номер уведомления, число не входит в диапазон',
                                 parse_mode='HTML')
            else:
                with open("notifications.json") as file:
                    data = json.load(file)
                bot.send_message(message.from_user.id, f'Удалено уведомление:\n'
                                                       f'{data[str(message.from_user.id)][int(message.text) - 1]["name"]}\n'
                                                       f'Время уведомления: {plusUTC(listToInterval(cutTime(data[str(message.from_user.id)][int(message.text) - 1]["time"])), message.from_user.id, -1)}',
                                 parse_mode='HTML')
                data[str(message.from_user.id)].remove(data[str(message.from_user.id)][int(message.text) - 1])
                del_list = ''
                for i in range(len(data[str(message.from_user.id)])):
                    del_list += (f'{i + 1}. Текст: {data[str(message.from_user.id)][i]["name"]} ;'
                                 f' Время: {plusUTC(listToInterval(cutTime(data[str(message.from_user.id)][i]["time"])), message.from_user.id, -1)}\n')
                if len(del_list) != 0:
                    bot.send_message(message.from_user.id, f'Список уведомлений:\n{del_list}', parse_mode='HTML')
                else:
                    bot.send_message(message.from_user.id, 'Уведомлений нет', parse_mode='HTML')
               
                with open("notifications.json", 'w') as file:
                    json.dump(data, file, indent=2)

        except NameError:
            bot.send_message(message.from_user.id, 'Введи номер уведомления,это должно быть число', parse_mode='HTML')
        except IndexError:
            bot.send_message(message.from_user.id, 'Введи номер уведомления', parse_mode='HTML')
        except ValueError:
            pass

    if message.text == 'Меню':
        markup = types.InlineKeyboardMarkup()
        btn1 = types.InlineKeyboardButton(text="Создать напоминание", callback_data='new_notification')
        btn2 = types.InlineKeyboardButton(text="Удалить напоминание", callback_data='delete_notification')
        btn4 = types.InlineKeyboardButton(text="Задать часовой пояс", callback_data='set UTC')
        markup.add(btn1, btn2, btn4)
        bot.send_message(message.chat.id,
                         "Вот меню для действий:",
                         reply_markup=markup)


bot.polling(none_stop=True)

Скрипт для отправки уведомлений:

import telebot
import time
from datetime import datetime
import json

bot = telebot.TeleBot('', parse_mode=None)

# Запускаем цикл для проверки времени
while True:
    with open("notifications.json") as file:
        data = json.load(file)
    try:
        message_data = tuple(data.values())
        now = datetime.now()
        current_time = now.strftime("%H:%M:%S")
        for i in range(1,len(message_data)):
            if len(message_data[i])!=0:
                for j in range (len(message_data[i])):
                    if current_time in message_data[i][j]["time"]:
                        bot.send_message(int(tuple(data)[i]), f'Тебе пришло напоминание: {message_data[i][j]["name"]}')
                        print( 'кому-то пришло уведолмение')
                    else:
                        pass
            else:
                pass
    except IndexError:
        pass
    time.sleep(1)

Есть какие-то советы как можно перенаправить print из второго файла в вывод первого или запустить вторым процессом, не задействуя 2й файл?


Ответы (0 шт):