我使用Jupyter Notebook运行一系列需要一些时间的实验。
某些单元格的执行时间太长,因此关闭浏览器选项卡并稍后再回来是很正常的。但是这样做会导致内核中断运行。
我猜有一种解决方法,但我找不到它。
我使用Jupyter Notebook运行一系列需要一些时间的实验。
某些单元格的执行时间太长,因此关闭浏览器选项卡并稍后再回来是很正常的。但是这样做会导致内核中断运行。
我猜有一种解决方法,但我找不到它。
最简单的解决方法似乎是使用内置的单元格魔法 %%capture:
%%capture output
# Time-consuming code here
保存,关闭标签页,稍后回来。输出现在存储在output
变量中:
output.show()
这将显示所有的中间print
结果以及纯文本或富文本输出单元格。
关闭标签页后,代码不会停止运行,但输出无法找到当前浏览器会话并丢失有关其应如何显示的数据,导致它抛出所有接收到的新输出,直到运行当时正在运行的代码完成。
很遗憾,这个功能目前还没有实现(截至11月24日)。如果有解决方法,我也找不到。 (继续寻找,将更新相关消息。)有一种解决方法可以保存输出然后重新打印,但如果代码仍在该笔记本中运行,则无法正常工作。另一种替代方法是使用第二个笔记本来获取输出。
我也需要这个功能,原因相同。关闭标签页时内核不会关闭或中断。代码也不会停止运行。警告信息非常准确,“内核正忙,可能会丢失输出。”
运行中。
import time
a = 0
while a < 100:
a+=1
print(a)
time.sleep(1)
print(a)
runipy。
pip install runipy
现在使用以下命令在后台运行你的笔记本:
nohup runipy YourNotebook.ipynb OutputNotebook.ipynb >> notebook.log &
现在输出文件将被保存,您还可以通过以下方式查看运行日志:
tail -f notebook.log
如果您使用的是JupyterLab(当前版本为v3.x.x
),那么这不是一个问题。
更具体地说,不是问题指的是,在关闭选项卡/浏览器后,笔记本的内核仍在运行(只要jupyter服务器/终端没有关闭)。但是,单元格的打印输出(如果有)会被中断。
因此,当我们重新打开笔记本时,变量等都会保留并更新,但是被中断的打印输出不会显示。
如果您关心此情况下的打印信息,可以尝试将其记录到文件中。或者尝试使用Jupyter的执行API(请参见下文)。
如果您仍然坚持使用旧版(例如版本5.x / 6.x)Jupyter Notebook,那么在过去(即2022年之前)也无法解决这个问题。
但是,计划中的新Notebook v7版本将重用JupyterLab代码库,这个问题也将在新的Jupyter Notebook中得到解决。
因此,建议使用JupyterLab或等待并更新到Notebook v7:
$ jupyter lab --version
$ 3.4.4
$ # OR waite and update the notebook, untill
$ # make sure the installed version of notebook is v7
$ jupyter notebook --version
$ 6.4.12
另一个解决方法是使用Jupyter的执行API:
$ jupyter nbconvert --to notebook --execute mynotebook.ipynb
我也一直在为这个问题苦苦挣扎。
我的解决方法是将所有日志写入文件,这样当我的浏览器关闭时(确实当大量日志通过浏览器传输时,它也会挂起),我可以通过打开日志文件来查看内核作业进程(日志文件也可以使用Jupyter打开)。
#!/usr/bin/python
import time
import datetime
import logging
logger = logging.getLogger()
def setup_file_logger(log_file):
hdlr = logging.FileHandler(log_file)
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
def log(message):
#outputs to Jupyter console
print('{} {}'.format(datetime.datetime.now(), message))
#outputs to file
logger.info(message)
setup_file_logger('out.log')
for i in range(10000):
log('Doing hard work here i=' + str(i))
log('Taking a nap now...')
time.sleep(1000)
我之前使用 jupyter nbconvert
构建了这个程序,本质上是在后台运行一个笔记本而没有任何 UI:
nohup jupyter nbconvert --ExecutePreprocessor.timeout=-1 --CodeFoldingPreprocessor.remove_folded_code=False --ExecutePreprocessor.allow_errors=True --ExecutePreprocessor.kernel_name=python3 --execute --to notebook --inplace ~/mynotebook.ipynb > ~/stdout.log 2> ~/stderr.log &
timeout=-1
表示无超时限制remove_folded_code=False
如果启用了 Codefolding 扩展,则不删除折叠的代码allow_errors=True
忽略错误单元格并继续运行笔记本直到结束kernel_name
如果您有多个内核,请使用 jupyter kernelspec list
进行检查%%capture
更好。您始终可以在内核忙碌时打开日志文件。import sys
sys.stdout = open("my_log.txt", "a")