Skip to content

Instantly share code, notes, and snippets.

@SHDShim
Last active January 13, 2021 16:41
Show Gist options
  • Save SHDShim/6230904dab9d0d52ad3fe6b1b191a54c to your computer and use it in GitHub Desktop.
Save SHDShim/6230904dab9d0d52ad3fe6b1b191a54c to your computer and use it in GitHub Desktop.
jupyter notebook, python, html, git

Faster post save hook for Jupyter notebook

ipynb files are great but difficult to share with colleagues. Often it is also convenient if I can quickly read the codes in ipynb files without running jupyter notebook. You can make jupyter notebook to save contents in html and py files when you save ipynb file. You just need to make a file and place it under your home folder. See the instruction below.

The code below provides faster and better post save hook for *.py and *.html. Unfortunately I do not remember the source.

This needs to be saved as jupyter_notebook_config.py under the ~/.jupyter folder.

import io
import os
from notebook.utils import to_api_path

_script_exporter = None
_html_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
    from nbconvert.exporters.html import HTMLExporter

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

    global _script_exporter
    if _script_exporter is None:
        _script_exporter = ScriptExporter(parent=contents_manager)
    log = contents_manager.log

    global _html_exporter
    if _html_exporter is None:
        _html_exporter = HTMLExporter(parent=contents_manager)
    log = contents_manager.log

    # save .py file
    base, ext = os.path.splitext(os_path)
    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)

    # save html
    base, ext = os.path.splitext(os_path)
    script, resources = _html_exporter.from_filename(os_path)
    script_fname = base + resources.get('output_extension', '.txt')
    log.info("Saving html /%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

For windows to generate the setup file: https://stackoverflow.com/questions/35254852/how-to-change-the-jupyter-start-up-folder

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment