Я новичок с sh по Python, но не совсем неопытный. Я бы оценил свой опыт где-то между новичком и средним. При этом я застрял на этой проблеме несколько недель.
Я работаю в среде со встроенной версией Python в многозначной базе данных Rocket Universe. Ранее это было python 3.4, и обновление до 3.7 сломало то, как я использовал многопроцессорность. Пользователь этого приложения использует клиент S SH для взаимодействия с TUI
Некоторые сведения о том, что я пытаюсь выполнить sh:
У меня есть программа, написанная на BASI C, эта программа принимает аргументы параметров для отправки электронного письма, затем передает их в конструктивную функцию, которая анализирует аргументы стиля BASI C в аргументы Pythoni c, создает соответствующее сообщение электронной почты MIMEMultipart и затем отправляет его. . Идея состоит в том, чтобы заменить старую почтовую программу (AWMAIL) на более надежную альтернативу Python.
Отправка обычного c электронного письма работает нормально, без проблем. Отправка электронного письма с вложением в этой системе становится сложной задачей, так как BASI C выполнит вызов «Go построить вложение» в другую программу BASI C, а затем «Go отправить приложение по электронной почте» на мой адрес электронной почты. программа. Когда вложение занимает слишком много времени, Python не может его найти.
Очевидно, что простое решение - просто подождать дольше, чтобы найти вложение. Используя многопроцессорность, я смог сделать это «в фоновом режиме», используя другой процесс. Благодаря этому пользователь мог go заниматься своими делами, ожидая письма. (Вместо того, чтобы Python удерживать пользователя в командной строке). Многопоточность не возвращала контроль над терминалом пользователю, разветвление (os.fork ()) дублировало бы процесс, и терминал отправлял вывод и получал ввод от двух разных процессов (это было очень странно и сломало много вещей, 0/10 не рекомендуется).
В Python 3.4 я смог использовать это безупречно:
#I build the loggers and log handlers here.
#
def send_awmail(uv_sentence, trace, login, tty):
multiprocessing.set_executable('embed_python_exec')
sys.argv = ["path_to_this_script"}
multiprocessing.set_start_method("spawn")
proc = multiprocessing.Process(target=send_awmail_email, args = (uv_sentence, trace, login, tty, )) proc.start()
def send_awmail_email(uv_sentence, trace, login, tty):
logging.debug("ProcID from child: {}".format(os.getpid()))
awmail = myemailmodule.EmailBuilderClass(uv_sentence = uv_sentence, trace = trace, login =login, tty = tty)
awmail.send_email()
Это сгенерирует запрос электронной почты и создаст электронное письмо, отправив его . Внутри класса EmailBuilderClass находятся различные операторы ведения журнала, которые записываются в файл журнала или отправляют электронное письмо с предупреждением в ИТ-отдел. Все работало, и все в мире было хорошо. Пока мы не обновились.
Сейчас мы находимся на более новой версии Universe, в которой используется python3 .7. Приведенный выше код больше не регистрируется и только изредка отправляет электронное письмо. Поскольку журналов нет, я не могу понять, что происходит. Я пробовал установить pro c .daemon = True перед запуском, похоже, это правильно вызывает функцию и работает, но что бы я ни делал, я не могу заставить ее регистрировать, когда daemon = True.
Я попытался создать регистратор в функции демона (send_awmail_email ()), но без улучшения.
Я нырнул в несколько кроличьих нор, пытаясь решить проблему:
- Регистрация запроса на электронную почту
- Отправка электронной почты
- Создание электронной почты и прикрепление файла в фоновом режиме, чтобы пользователь не ждал у терминала.
Есть ли у кого-нибудь идеи, как это сделать? Я готов отказаться от библиотеки многопроцессорной обработки, если это необходимо. Поиск в Google и inte rnet не дал мне особой надежды на это. Я ценю любые идеи и отзывы.