gpt4 book ai didi

python - 将 sys.stdout 重定向到特定的 Jupyter Notebook 单元格

转载 作者:行者123 更新时间:2023-12-04 11:03:04 24 4
gpt4 key购买 nike

Jupyter==4.1.0,Python==2.7.10,IPython==4.2.0
我正在为我的 Jupyter Notebooks 编写一个 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 the 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
我基本上希望能够获得 parent_header单元格 In[1] 并将单元格 In[2] 的输出重定向到 In[1] 的输出。
例子:
获取 parent_header在[1]:
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'

最佳答案

您可以使用 ipywidgets.Output 的组合( docs )和锁定:
enter image description here
jupyter 单元格中的代码:

# In[1]:


from threading import Thread, Lock
import time
from ipywidgets import Output


# In[2]:


output1 = Output()
output1


# In[3]:


output2 = Output()
output2


# In[4]:


print_lock = Lock()
def t1_main():
for i in range(10):
with print_lock, output1:
print('thread1', i)
time.sleep(0.5)

def t2_main():
for i in range(10):
with print_lock, output2:
print('thread2', i)
time.sleep(0.5)

output1.clear_output()
output2.clear_output()

t1 = Thread(target=t1_main)
t2 = Thread(target=t2_main)
t1.start()
t2.start()
t1.join()
t2.join()

关于python - 将 sys.stdout 重定向到特定的 Jupyter Notebook 单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40579824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com