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