如何将我的子进程标准输出重定向到我的主程序jupyter笔记本?

时间:2019-06-03 14:30:06

标签: python multiprocessing jupyter-notebook stdout

我正在Windows的jupyter笔记本上学习python。对于我的项目之一,我需要多处理。我的问题是我的子进程在命令窗口中打印并显示错误,我希望它在jupyter笔记本中显示它们。

我尝试获取主程序的sys.stdout并通过Pipe将其提供给子进程,但是在尝试发送它时,出现此错误:

PicklingError: Can't pickle <function <lambda> at 0x04A1AA98>: attribute lookup <lambda> on jupyter_client.session failed

我认为Pipe不喜欢sys.stdout提供的对象类型,因此我尝试将其转换为字符串,但是此后在子进程中我没有设法对其进行取消字符串操作(eval不起作用)。 / p>

主文件:

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文件:

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个键可以使用该功能恢复,暂停和停止该过程)。 这只是我程序质量的提高,但是我觉得学习如何管理流程输出是一件很重要的事情。

0 个答案:

没有答案