ipython notebook --script deprecated. How to replace with post save hook?

前端 未结 3 847
情话喂你
情话喂你 2020-12-08 22:17

I have been using \"ipython --script\" to automatically save a .py file for each ipython notebook so I can use it to import classes into other notebooks. But this recenty st

3条回答
  •  误落风尘
    2020-12-08 22:51

    Here is another approach that doesn't invoke a new thread (with check_call). Add the following to jupyter_notebook_config.py as in Tristan's answer:

    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
    

    Disclaimer: I'm pretty sure I got this from SO somwhere, but can't find it now. Putting it here so it's easier to find in future (:

提交回复
热议问题