jupyter notebook 扩展开发之 文件保存钩子

xxxspy 2018-03-31 20:19:18
Categories: Tags:

这是jupyter notebook 插件开发的系列文档之一, 文章最末尾列出了这个系列的所有博客连接.

文件保存钩子

您可以配置保存文件时运行的函数。有两个可用的钩子:

它们都用关键字参数调用:

1
2
pre_save_hook(model=model, path=path, contents_manager=cm)
post_save_hook(model=model, os_path=os_path, contents_manager=cm)

例子

这些都可以添加到jupyter_notebook_config.py

剥离输出的预保存钩子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def scrub_output_pre_save(model, **kwargs):
"""scrub output before saving notebooks"""
# only run on notebooks
if model['type'] != 'notebook':
return
# only run on nbformat v4
if model['content']['nbformat'] != 4:
return

for cell in model['content']['cells']:
if cell['cell_type'] != 'code':
continue
cell['outputs'] = []
cell['execution_count'] = None

c.FileContentsManager.pre_save_hook = scrub_output_pre_save

一个保存后的挂钩,可以在笔记本保存时替换脚本(替换旧版本笔记本中的–script选项):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import io
import os
from notebook.utils import to_api_path

_script_exporter = None

def script_post_save(model, os_path, contents_manager, **kwargs):
"""convert notebooks to Python script after save with nbconvert

replaces `ipython notebook --script`
"""
from nbconvert.exporters.script import ScriptExporter

if model['type'] != 'notebook':
return

global _script_exporter

if _script_exporter is None:
_script_exporter = ScriptExporter(parent=contents_manager)

log = contents_manager.log

base, ext = os.path.splitext(os_path)
py_fname = base + '.py'
script, resources = _script_exporter.from_filename(os_path)
script_fname = base + resources.get('output_extension', '.txt')
log.info("Saving script /%s", to_api_path(script_fname, contents_manager.root_dir))

with io.open(script_fname, 'w', encoding='utf-8') as f:
f.write(script)

c.FileContentsManager.post_save_hook = script_post_save

这可能是一个简单的调用jupyter nbconvert --to script,但每次产生子进程都很慢。

jupyter notebook 扩展开发系列:

转载请注明出处:http://mlln.cn 或者 http://jupyter.cn