关闭浏览器选项卡后,保持Jupyter笔记本运行

时间:2015-09-12 14:17:36

标签: python-2.7 ipython-notebook jupyter

我使用Jupyter Notebook进行一系列需要一些时间的实验。 某些单元格需要花费太多时间才能执行,所以我很乐意关闭浏览器标签并稍后再回来。但是当我做内核中断运行时。

我想有一个解决方法,但我无法找到它

5 个答案:

答案 0 :(得分:26)

最简单的解决方法似乎是built-in cell magic %%capture

%%capture output
# Time-consuming code here

保存,关闭标签,稍后再回来。输出现在存储在output变量:

output.show()

这将显示所有临时print结果以及普通或富输出单元格。

答案 1 :(得分:12)

TL; DR:

代码不会在选项卡关闭时停止,但输出无法再找到当前的浏览器会话并丢失有关它应该如何显示的数据,导致它丢弃所有收到的新输出,直到代码完成选项卡关闭时正在运行。

长版:

不幸的是,这没有实施(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中的那个hacks会起作用,因为它可以接收它们并将它们扔进某个单元格

输出只能通过端点连接以可访问的方式保存。 They've been working on this for a while (before Jupyter),虽然我找不到Jupyter存储库中的当前错误(this one references it, but is not it)。

唯一的一般解决方法似乎是找到一台可以随时离开的计算机,并在运行时将其留在页面上,然后远程进入或依靠自动保存以便能够在其他地方访问它。这是一个不好的方法,但不幸的是,我现在的方式。

相关问题:

答案 2 :(得分:2)

我现在也在努力解决这个问题。

我的解决方法是将所有日志写入文件,这样当我的浏览器关闭时(实际上当很多日志通过浏览器时它也会挂起)我可以通过打开日志文件看到内核作业进程(日志文件也可以使用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)

答案 3 :(得分:0)

首先,安装

  

暴躁

pip install runipy

现在,使用以下命令在后台运行笔记本电脑:

nohup runipy YourNotebook.ipynb OutputNotebook.ipynb >> notebook.log &

现在将保存输出文件,并且您可以在使用以下命令运行时看到日志:

tail -f notebook.log

答案 4 :(得分:0)

如果已将所有单元格设置为运行并想定期检查正在打印的内容,那么以下代码比%%capture更好。您总是可以在内核繁忙时打开日志文件。

import sys
sys.stdout = open("my_log.txt", "a")