Jupyter == 4.1.0,Python == 2.7.10,IPython == 4.2.0

我正在为我的Jupyter笔记本编写一个SQL UI,并希望结合多线程,以便我可以在一个单元格中运行查询,并在查询运行时继续在其他单元格中工作 .

我遇到的问题是,如果我在一个单元格中执行查询,输出将显示在最后执行的单元格的输出提示中,而不是在执行查询的单元格的输出提示中 .

我仔细检查了网络并发现了this clever trick,但我认为它已经过时了和/或在我的Jupyter版本中不再适用 . 当我运行它时,我只获得上次执行的任何单元格的输出 . 因此,如果我同时运行两者,我只获得最后执行的输出,而不是输出打印以同时分离单元格 .

所以我有我的上下文管理器设置 parent_header

import sys
import threading
from contextlib import contextmanager

# we need a lock, so that other threads don't snatch control
# while we have set a temporary parent
stdout_lock = threading.Lock()

@contextmanager
def set_stdout_parent(parent):
    """a context manager for setting a particular parent for sys.stdout 
    the parent determines the destination cell of output
    """
    save_parent = sys.stdout.parent_header
    with stdout_lock:
        sys.stdout.parent_header = parent
        try:
            yield
        finally:
            # the flush is important, because that's when the parent_header actually has its effect
            sys.stdout.flush()
            sys.stdout.parent_header = save_parent

我本质上希望能够得到[1]中的单元格 parent_header 并将单元格[2]的输出重定向到In [1]的输出 .

例:

获取In [1]中的 parent_header

In[1]: t = sys.stdout.parent_header

然后将运行以下代码,但输出应打印到Out [1](当前,我运行此代码时没有输出):

In [2]: with set_stdout_parent(t):
            print 'FOO'

哪个应该产生:

In[1]: t = sys.stdout.parent_header
Out[1]:'FOO'