我有一个Jupyter笔记本服务器在某个集群上的Docker容器内运行,我在一堆这样的笔记本中运行一些scala代码(使用Spark)。它们在某个URL(http://blah.com:11111/tree
)外部显示。我需要通过编写一个可以从任何地方运行笔记本的python脚本来自动执行此操作:打开URL,运行它,关闭并在需要时重新启动内核等等。在here和there上有一些提及,但是有一个完整的例子会很好:在Python中打开笔记本服务器的HTTP请求,与之交互,关闭它。 nbconvert方法在这种情况下不起作用(假设无法访问Jupyter服务器)。 jupyter kernel_gateway听起来很有趣,但我找不到一个很好的例子,它展示了如何在Python中打开笔记本服务器的HTTP请求,与之交互,关闭它。有一些有趣的信息jupyter-client messaging和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)
此代码可以作为进一步自动化的基础:将my_notebook.ipynb
作为json文件读取,更改其中的代码和单元格,将其存储回来并重新运行它。基于此可以开发各种循环和分支以及多处理。但是,这对spylon-kernel和scala / Spark笔记本不起作用。当我执行kernel_name='spylon-kernel'
时,它会给我异常NoSuchKernel: No such kernel named spylon-kernel
我认为解决方案应来自jupyter-client,但我无法找到一个好的例子。