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'