Как перенаправить мой дочерний стандартный процесс в мою основную программу jupyter notebook? - PullRequest
1 голос
/ 03 июня 2019

Я изучаю 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 клавиши могут возобновить, приостановить и остановить процесс с помощью функции). Это просто улучшение качества жизни моей программы, но я чувствую, что научиться управлять выходом процессов - важная вещь для изучения.

...