Я изучаю Python на ноутбуке Jupyter, на Windows. Для одного из моих проектов мне нужна многопроцессорная обработка. Моя проблема в том, что мой дочерний процесс печатает и отображает ошибки в командном окне, и я хотел бы, чтобы он отображал их в моем блокноте jupyter.
Я попытался получить sys.stdout основной программы и передать его дочернему процессу через канал, но при попытке отправить его я получаю эту ошибку:
PicklingError: Can't pickle <function <lambda> at 0x04A1AA98>: attribute lookup <lambda> on jupyter_client.session failed
Я полагаю, что каналу не нравится тип объекта, который дает sys.stdout, поэтому я попытался преобразовать его в строку, но мне не удалось впоследствии удалить его в дочернем процессе (eval не работает).
Основной файл:
def safefunc(function,play,pause,stop): # arg of type <enum 'Key'>
parent_conn, child_conn = Pipe()
parent_conn2, child_conn2 = Pipe()
original = sys.stdout
parent_conn2.send(original)
processfailsafe = multiprocessing.Process(target = mybunchoffunc.failsafefunc, args = (play,pause,stop,child_conn))
processfunction = multiprocessing.Process(target = mybunchoffunc.funcfunc, args = (function,parent_conn,child_conn2))
processfailsafe.start()
processfunction.start()
processfunction.join()
mybunchoffunc.py file:
def funcfunc(function,conn,conn2):
current_process_pid = psutil.Process().pid
conn.send(current_process_pid)
orig = conn2.recv()
sys.stdout = orig
function()
failpid = conn.recv()
failproc = psutil.Process(failpid)
failproc.terminate()
Остальная часть моей программы работает отлично (если вам нужен фон, моя цель - иметь функцию, которая принимает функцию и 3 ключа pynput в качестве аргументов, запускает функцию в одном процессе и прослушивает pynput другой процесс и имеет 3 клавиши могут возобновить, приостановить и остановить процесс с помощью функции).
Это просто улучшение качества жизни моей программы, но я чувствую, что научиться управлять выходом процессов - важная вещь для изучения.