【问题标题】:Keep Jupyter notebook running after closing browser tab关闭浏览器选项卡后保持 Jupyter 笔记本运行
【发布时间】:2015-12-08 23:32:31
【问题描述】:

我使用 Jupyter Notebook 运行一系列需要一些时间的实验。 某些单元格需要太多时间来执行,所以我想关闭浏览器选项卡并稍后再回来是很正常的。但是当我做内核中断运行时。

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

【问题讨论】:

    标签: python-2.7 ipython-notebook jupyter


    【解决方案1】:

    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 中的那个黑客将起作用,因为它可以接收这些并将它们扔到某个单元格中。

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

    唯一的通用解决方法似乎是找到一台您始终可以使用的计算机,并在它运行时将其留在页面上,然后远程进入或依靠自动保存来在其他地方访问它。这是一个不好的方法,但不幸的是,我现在必须这样做。

    相关问题:

    【讨论】:

    • 我认为关闭选项卡时代码实际上并没有被中断。但是,正如您所说,输出是。因此,我使用的不优雅的解决方法是仅以一种易于重新生成输出的方式存储我的计算结果。特别是,我存储了分类中的混淆矩阵和 ROC 曲线,然后重新绘制它们。
    • 你是对的。我终于有时间重新测试这个。接得好。我还从 Jupyter 和 IPython 的错误列表本身获得了更多详细信息。我会追捕他们并更新帖子。
    • 通过菜单命令“全部运行”运行整个笔记本怎么样?执行一个单元格后是否停止?
    • @IanS 这是个好问题。除非有人抢先一步,否则我会尽快回复你。
    • 谢谢!我进行了一些实验,我很确定整个笔记本都能执行。当然,输出会丢失,但所有单元格都会运行到最后。
    【解决方案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】:

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

      %%capture output
      # Time-consuming code here
      

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

      output.show()
      

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

      【讨论】:

        【解决方案4】:

        首先,安装

        鲁尼派

        pip install runipy
        

        现在使用以下命令在后台运行您的笔记本:

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

        现在输出文件将被保存,您还可以在运行时查看日志:

        tail -f notebook.log
        

        【讨论】:

        • 现在,如果您这样做,即使程序需要 10 多个小时才能运行,它还会继续运行吗?
        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我之前使用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 &gt; ~/stdout.log 2&gt; ~/stderr.log &amp;

          • timeout=-1没有超时
          • remove_folded_code=False 如果您启用了 Codefolding 扩展
          • allow_errors=True 忽略错误的单元格并继续运行笔记本到最后
          • kernel_name 如果您有多个内核,请与 jupyter kernelspec list 检查

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-10
            • 2013-10-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多