【问题标题】:execute jupyter notebook and keep attached to existing kernel执行 jupyter notebook 并保持连接到现有内核
【发布时间】:2017-03-15 05:57:42
【问题描述】:

我知道nbconvert 并使用它来生成带有结果输出的静态 html 或 ipynb 文件。但是,我希望能够生成一个与我已经运行的内核保持连接的笔记本,以便在运行所有模板单元后进行进一步的数据探索。有没有办法做到这一点?

【问题讨论】:

  • 我理解您为什么要这样做,但它对我来说似乎很脆弱。如果您可以持久化 notebook 生成的结果数据,那么您可以将其加载到新内核中并在那里进行探索。这将允许对生成的数据集进行多个探索性会话,而持久内核连接不允许这样做。
  • 这是一个有趣的建议。我不喜欢的事情是它迫使我考虑从第一次运行开始我想要保存的所有变量并编写代码来保存和加载它们。如果我反复执行此模式,我不想这样做 - 我只想要在特定内核中打开特定笔记本并单击“全部运行”。大概这样做只是对服务器的一系列 http 调用,所以我的问题是,是否有一种编程方式来做同样的事情。
  • 如果你想保留你的探索状态,那么%save%load 魔法函数可能是你想要的。我在想您想附加到正在运行的内核的原因是该状态的计算成本很高。 %save 可让您按照执行顺序保存已完成的操作。

标签: ipython jupyter jupyter-notebook nbconvert


【解决方案1】:

显然,您可以通过 Python API 做到这一点。我自己没有尝试过,但是对于正在寻找解决方案的人,this PR 在 cmets 中有一个示例:

from nbconvert.preprocessors.execute import executenb, ExecutePreprocessor
from nbformat import read as nbread
from jupyter_client.manager import start_new_kernel

nb = nbread('parsee.ipynb', as_version=4)
kernel_name = nb.metadata.get('kernelspec', {}).get('name', 'python')
km, kc = start_new_kernel(kernel_name=kernel_name)
executenb(nb, kernel=(km, kc))
kc.execute_interactive('a')  # a is a variable defined in parsee.ipynb with 'a = 1'

【讨论】:

    【解决方案2】:

    如果我理解正确,您希望打开 Python 控制台,并将 Jupyter 笔记本连接到该内核实例?

    也许您的解决方案是编辑 jupyter 脚本本身并在单独的线程/后台任务中运行服务器,实现线程之间的某种连接并在 jupyter 控制台中工作?目前这是不可能的,因为主线程正在运行服务器。

    这需要一些工作,我没有任何解决方案,但我会调查一下,如果可以的话,可能会编辑这个答案。

    但似乎最简单的解决方案是简单地在笔记本中添加另一个字段并在那里做任何你想做的事情。有理由不这样做吗?

    【讨论】:

    • 不,我认为这不是问题所在。为了澄清一点,我有一个 jupyter notebook 服务器正在运行,还有一个尚未执行的 notebook。我想要一种以编程方式告诉服务器执行笔记本并使其运行连接到该服务器的方法。
    • 我仍然认为如果您与 jupyter 脚本本身混合使用,这是可行的
    • 我的意思是您可能可以在打开时以编程方式执行笔记本。然后它应该工作。你只需要管理笔记本。 @unsorted,你的最终目标是什么?您似乎正在尝试在笔记本之间进行通信?
    【解决方案3】:

    不太确定你的目的。但我的一般解决方案是,

    1. 在命令行中执行notebook,同时查看执行情况,

      jupyter nbconvert --debug --allow-errors --stdout --execute test.ipynb

    这将显示调试模式下所有单元的执行,即使发生异常。但是直到执行结束我才能看到结果。

    1. 将结果输出到html文件,然后打开html文件查看结果。我发现这更方便。

      jupyter nbconvert --execute --allow-errors --stdout test.ipynb >> result.html 2>&1

    如果你打开 result.html,它会是,

    所有的错误和结果都会显示在页面上。

    我想向大家学习其他答案/解决方案。谢谢。

    【讨论】:

    • 对,这两种方法都会生成静态输出。但我的目标是让笔记本“活动”并附加到现有内核,所有变量仍然定义,以进行进一步的数据探索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多