【发布时间】:2015-12-08 23:32:31
【问题描述】:
我使用 Jupyter Notebook 运行一系列需要一些时间的实验。 某些单元格需要太多时间来执行,所以我想关闭浏览器选项卡并稍后再回来是很正常的。但是当我做内核中断运行时。
我想有一个解决方法,但我找不到它
【问题讨论】:
标签: python-2.7 ipython-notebook jupyter
我使用 Jupyter Notebook 运行一系列需要一些时间的实验。 某些单元格需要太多时间来执行,所以我想关闭浏览器选项卡并稍后再回来是很正常的。但是当我做内核中断运行时。
我想有一个解决方法,但我找不到它
【问题讨论】:
标签: python-2.7 ipython-notebook jupyter
代码不会在选项卡关闭时停止,但输出无法再找到当前浏览器会话并丢失有关其应如何显示的数据,导致它丢弃所有收到的新输出,直到代码完成选项卡关闭时正在运行。
很遗憾,这并未实施(11 月 24 日)。如果有解决方法,我也找不到。 (仍在寻找,将更新新闻。)There is a workaround that saves output then reprints it,但如果代码仍在该笔记本中运行,则将无法工作。另一种方法是拥有第二个笔记本,您可以在其中获取输出。
出于同样的原因,我也需要此功能。内核不会在选项卡关闭时关闭或中断。当您关闭选项卡时,代码不会停止运行。给出的警告是完全正确的,“内核很忙,输出可能会丢失。”
跑步
import time
a = 0
while a < 100:
a+=1
print(a)
time.sleep(1)
在一个框中,然后关闭选项卡,再次打开它,然后运行
print(a)
从另一个盒子会导致它挂起,直到 100 秒完成并且代码完成,然后它会打印 100。
当一个选项卡关闭时,当您返回时,python 进程将处于您离开它的相同状态(上次保存完成时)。这是他们的预期行为,他们应该在文档中更清楚地说明什么。运行代码的输出实际上是在重新打开浏览器时发送到浏览器的(丢失了解释这一点的参考资料),因此像this comment 中的那个黑客将起作用,因为它可以接收这些并将它们扔到某个单元格中。
输出只是通过端点连接以可访问的方式保存。 They've been working on this for a while (before Jupyter),虽然我在 Jupyter 存储库中找不到当前的错误 (this one references it, but is not it)。
唯一的通用解决方法似乎是找到一台您始终可以使用的计算机,并在它运行时将其留在页面上,然后远程进入或依靠自动保存来在其他地方访问它。这是一个不好的方法,但不幸的是,我现在必须这样做。
相关问题:
【讨论】:
我现在也在为这个问题苦苦挣扎了一段时间。
我的解决方法是将我的所有日志写入一个文件,这样当我的浏览器关闭时(事实上,当很多日志通过浏览器时它也会挂起)我可以通过打开日志文件来查看内核作业过程(日志文件也可以使用 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)
【讨论】:
最简单的解决方法似乎是built-in cell magic%%capture:
%%capture output
# Time-consuming code here
保存,关闭标签,稍后再回来。输出现在存储在output 变量中:
output.show()
这将显示所有临时 print 结果以及普通或丰富的输出单元格。
【讨论】:
首先,安装
鲁尼派
pip install runipy
现在使用以下命令在后台运行您的笔记本:
nohup runipy YourNotebook.ipynb OutputNotebook.ipynb >> notebook.log &
现在输出文件将被保存,您还可以在运行时查看日志:
tail -f notebook.log
【讨论】:
如果您已将所有单元格设置为运行并希望定期检查正在打印的内容,则以下代码将是比%%capture 更好的选择。您可以在内核忙碌时随时打开日志文件。
import sys
sys.stdout = open("my_log.txt", "a")
【讨论】:
我之前使用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 检查
【讨论】: