以编程方式与 Jupyter notebook 或内核交互

Dim*_*mon 5 python scala apache-spark jupyter jupyter-notebook

我有一个 Jupyter 笔记本服务器在某个集群上的 Docker 容器内运行,我在一堆这些笔记本中运行了一些 Scala 代码(使用 Spark)。它们在外部显示在某个 URL ( http://blah.com:11111/tree) 处。我需要通过编写一个可以从任何地方运行笔记本的 python 脚本来自动执行此操作:打开 URL,运行它,如果需要,关闭并重新启动内核等。这里那里有一些关于这个的提及,但最好有一个完整示例:在 Python 中打开对笔记本服务器的 HTTP 请求,与其交互,然后关闭它。该nbconvert方法不会在这种情况下(假设到Jupyter服务器无法访问)工作。该jupyter kernel_gateway听起来很有趣,但我找不到一个很好的例子来展示如何在 Python 中打开对笔记本服务器的 HTTP 请求,与之交互,关闭它。有一些有趣的信息jupyter-client 消息传递RESTful API,但我再次找不到我正在寻找的示例。谢谢你。

一种方法是创建一个笔记本并将以下代码放入其中:

import nbformat, os
from nbconvert.preprocessors import ExecutePreprocessor

print os.getcwd()

with open('./my_notebook.ipynb') as f:
  nb = nbformat.read(f, as_version=4)

ep = ExecutePreprocessor(timeout=30, kernel_name='python2')
ep.preprocess(nb, {'metadata': {'path': './'}})

with open('./my_notebook.ipynb', 'wt') as f:
  nbformat.write(nb, f)
Run Code Online (Sandbox Code Playgroud)

此代码可以作为进一步自动化的基础:读取my_notebook.ipynb为 json 文件,更改其中的代码和单元格,将其存储回去并再次重新运行。可以在此基础上开发各种循环和分支以及多处理。但是,这不适用于 spylon-kernel 和 scala/Spark 笔记本。当我这样做时,kernel_name='spylon-kernel'它给了我例外NoSuchKernel: No such kernel named spylon-kernel

我认为解决方案应该来自jupyter-client,但我找不到一个很好的例子。