Jupyter notebook 如何在启动jupyter的单元格中打印jupyter后台作业输出?

Jupyter notebook 如何在启动jupyter的单元格中打印jupyter后台作业输出?,jupyter-notebook,output,cell,background-process,Jupyter Notebook,Output,Cell,Background Process,从IPython Jupyter笔记本启动后台作业时,如何使打印输出显示在启动作业的单元格中,而不是显示在当前工作的单元格中 print()命令似乎打印到当前工作单元格中,而不是打印到启动后台作业的单元格中。有没有一种方法可以让它在启动时的单元格中很好地打印出来?这在运行多个后台作业集时尤其重要,因为要确定哪个作业集负责该行输出 编辑:它与任何代码一起出现,但这里有一个小片段来重现它: from IPython.lib import backgroundjobs as bg import tim

从IPython Jupyter笔记本启动后台作业时,如何使打印输出显示在启动作业的单元格中,而不是显示在当前工作的单元格中

print()
命令似乎打印到当前工作单元格中,而不是打印到启动后台作业的单元格中。有没有一种方法可以让它在启动时的单元格中很好地打印出来?这在运行多个后台作业集时尤其重要,因为要确定哪个作业集负责该行输出

编辑:它与任何代码一起出现,但这里有一个小片段来重现它:

from IPython.lib import backgroundjobs as bg
import time
def launchJob():
    for i in range(100):
       print('x')
       time.sleep(1)
jobs = bg.BackgroundJobManager()
for r in range(3):
    jobs.new("launchJob()")
这正是您所期望的,在单元格下的输出中每秒打印3 x。现在转到下一个单元格,键入
1+1
并执行它。将显示输出2,但任何剩余的x也将打印在此新单元格中,而不是原始单元格中

我正在寻找一种方法,专门告诉我的作业始终打印到执行它的原始单元格,以便在后台获取某种日志,或在后台生成一组绘图,或任何我希望在一个地方而不是在笔记本上显示的数据。

状态:

所有运行的线程共享相同的标准输出。因此,如果你的背景工作产生输出,它将出现在你目前正在写的任何东西之上。因此,后台作业最好与只返回其输出的静默函数一起使用

在IPython的GitHub pull请求(2011年10月)中,开发人员讨论了这个问题并得出结论。因此,他们决定在最新版本(编写本文时为7.9.0)中解决此问题,但尚未解决


同时,解决方法可以是将输出存储在变量中,或者在后台作业完成后将输出写入文件并打印

@Peter由于其他答案涉及使用pickle或输出文件执行此操作的方法,我想建议另一种方法。 我建议您在父窗口中启动打印操作。当在子进程窗口中达到执行的特定条件时,将这些值返回到父进程中的打印函数


使用
%matplotlib inline
打印父级单元格中的值。这在同一单元格中打印输出和视觉效果。

虽然这不是对我的问题的直接回答,因为它不适用于print命令,但我确实设法部分解决了我的问题,因为我可以在后面更新图形(因此可以在运行时记录任何类型的数据,而无需重新运行)

下面的一些概念验证代码基于


在运行时,在另一个单元格中键入1+1不会中断图形的更新。对我来说,这是一个游戏规则改变者,因此我将发布此消息,以防有人得到帮助。

你能提供重现问题的代码吗?添加了一些重现问题的代码。希望这能帮上忙。谢谢你查这个,真不幸。关于变通方法:如果后台进程(不是我编写或控制的)是一个python脚本,它使用print(…)来处理所有事情,那么我是否可以将输出存储在变量/文件中?如果您无法控制后台进程本身,它会变得更复杂。如果是常规流程,则可以使用捕获
stdout
。不幸的是,这似乎不适用于后台进程,我不知道还有其他解决方案。这实际上帮助我为我的问题创建了一个解决方案,谢谢!我已经赏金给你了,我不知道你在说什么。您介意添加示例代码,还是指向相关阅读?
%matplotlib notebook

import numpy as np
import matplotlib.pyplot as plt
import time
from IPython.lib import backgroundjobs as bg

def pltsin(ax, colors=['b']):
    x = np.linspace(0,1,100)
    if ax.lines:
        for line in ax.lines:
            line.set_xdata(x)
            y = np.random.random(size=(100,1))
            line.set_ydata(y)
    else:
        for color in colors:
            y = np.random.random(size=(100,1))
            ax.plot(x, y, color)
    fig.canvas.draw()

fig,ax = plt.subplots(1,1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xlim(0,1)
ax.set_ylim(0,1)

def launchJob():
    for i in range(100):
        pltsin(ax, ['b', 'r'])
        time.sleep(1)
jobs = bg.BackgroundJobManager()
jobs.new("launchJob()")