【问题标题】:Jupyter Notebook nbconvert without magic commands/ w/o markdownJupyter Notebook nbconvert 没有魔法命令/没有降价
【发布时间】:2020-01-02 05:17:32
【问题描述】:

我有一个Jupyter 笔记本,我想使用nbconvert 命令从Jupyter 笔记本内 将其转换为Python 脚本。

我在笔记本末尾添加了以下行:

!jupyter nbconvert --to script <filename>.ipynb

这将创建一个Python 脚本。但是,我希望生成的 .py 文件具有以下属性:

  1. 没有输入语句,例如:

    #在[27]:

  2. 没有降价,包括以下语句:

    #编码:utf-8

  3. 忽略%magic等命令:

    1. %matplotlib inline
    2. !jupyter nbconvert --to script &lt;filename&gt;.ipynb,即笔记本中执行Python转换的命令

    目前,%magic 命令被翻译成以下形式:get_ipython().magic(...),但在Python 中不一定能识别这些。

【问题讨论】:

    标签: python jupyter-notebook nbconvert


    【解决方案1】:

    控制输出中显示内容的一种方法是标记输出中不需要的单元格,然后使用 TagRemovePreprocessor 删除单元格。

    下面的代码也使用了 TemplateExporter 中的 exclude_markdown 函数来移除 markdown。

    !jupyter nbconvert \
        --TagRemovePreprocessor.enabled=True \
        --TagRemovePreprocessor.remove_cell_tags="['parameters']" \
        --TemplateExporter.exclude_markdown=True \
        --to python "notebook_with_parameters_removed.ipynb"
    

    要删除注释行和输入语句市场(如 # [1]),我相信您需要在调用 !jupyter nbconvert 的单元格之后的单元格中使用以下内容对 Python 文件进行后处理来自(注意这是 Python 3 代码):

    import re
    from pathlib import Path
    filename = Path.cwd() / 'notebook_with_parameters_removed.py'
    code_text = filename.read_text().split('\n')
    lines = [line for line in code_text if len(line) == 0 or 
            (line[0] != '#' and 'get_ipython()' not in line)]
    clean_code = '\n'.join(lines)
    clean_code = re.sub(r'\n{2,}', '\n\n', clean_code)
    filename.write_text(clean_code.strip())
    

    【讨论】:

      【解决方案2】:

      Jupyter nbconvert 使用新的template structure 使这变得更容易了。

      模板应放在模板路径中。这可以通过运行jupyter --paths找到

      每个模板都应该放在模板目录中自己的目录中,并且必须包含一个conf.json和index.py.j2文件。

      solution 涵盖了添加模板的所有详细信息。

      此模板将删除所有降价、魔术和单元格编号,留下一个“可运行”的 .py 文件。使用 !jupyter nbconvert --to python --template my_clean_python_template my_notebook.ipynb 在笔记本中运行此模板

      index.py.j2

      {%- extends 'null.j2' -%}
      
      ## set to python3
      {%- block header -%}
      #!/usr/bin/env python3
      # coding: utf-8
      {% endblock header %}
      
      ## remove cell counts entirely
      {% block in_prompt %}
      {% if resources.global_content_filter.include_input_prompt -%}
      {% endif %}
      {% endblock in_prompt %}
      
      ## remove markdown cells entirely
      {% block markdowncell %}
      {% endblock markdowncell %}
      
      {% block input %}
      {{ cell.source | ipython2python }}
      {% endblock input %}
      
      
      ## remove magic statement completely
      {% block codecell %}
      {{'' if "get_ipython" in super() else super() }}
      {% endblock codecell%}
      

      【讨论】:

      • 人们说这些模板在 nbconvert 的新版本中停止工作,请参阅 github.com/ipython/ipython/issues/3707。
      • @krvkir:你能说得更具体点吗?您提供的链接已经快一年了。此解决方案似乎适用于 nbconvert > 6.0。这就是我在多个平台上使用的 6.2.0 和 6.1.7 中的内容,看起来没问题。我还没有用 6.3.0 尝试过。模板的整个结构在 V5 和 V6 之间发生了变化。查看此解决方案了解详情:stackoverflow.com/a/64144224/5530152
      • 我的错,我忽略了您的解决方案是针对新模板系统的。很抱歉提供错误信息。
      【解决方案3】:

      最明显的解决方案似乎对我有用:

       jupyter nbconvert --to python a_notebook.ipynb --stdout | grep -v -e "^get_ipython" | python
      

      当然,您不能在笔记本中使用 dirs = !ls 之类的东西来实现这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2018-09-30
        • 1970-01-01
        • 2016-04-17
        相关资源
        最近更新 更多