Как перенаправить вывод одной программы на другую?
У меня бот на пайтоне через 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й файл?