【问题标题】:How to programmatically create several new cells in a Jupyter notebook如何以编程方式在 Jupyter 笔记本中创建多个新单元格
【发布时间】:2019-07-25 23:52:46
【问题描述】:

我想以编程方式在 Jupyter 笔记本中创建多个单元格。

使用这个功能我可以创建一个单元格

def create_new_cell(contents):
    from IPython.core.getipython import get_ipython
    shell = get_ipython()
    shell.set_next_input(contents, replace=False)

但如果我尝试多次调用它,例如,从 for 循环中调用,就像这样

for x in ['a', 'b', 'c']:
    create_new_cell(x)

它只会创建一个包含列表中最后一项的单元格。我试图找出是否有“刷新”功能或类似的功能,但没有成功。

有人知道如何以编程方式正确编写多个单元格吗?

【问题讨论】:

    标签: python jupyter-notebook


    【解决方案1】:

    我在shell.payload_manager 的代码中挖掘了更多内容,发现在set_next_input 的当前实现中,它没有将single 参数传递给shell.payload_manager.write_payload 函数。这可以防止笔记本创建多个单元格,因为它们都具有相同的源(在本例中为 set_next_input 函数)。

    话虽如此,以下功能有效。它基本上是来自write_payload 函数将single 参数设置为False 的代码。

    def create_new_cell(contents):
        from IPython.core.getipython import get_ipython
        shell = get_ipython()
    
        payload = dict(
            source='set_next_input',
            text=contents,
            replace=False,
        )
        shell.payload_manager.write_payload(payload, single=False)
    

    希望这对那里的人有所帮助;)

    【讨论】:

      【解决方案2】:
      from IPython.display import display, Javascript
      def add_cell(text,  type='code', direct='above'):
          text = text.replace('\n','\\n').replace("\"", "\\\"").replace("'", "\\'")
      
          display(Javascript('''
          var cell = IPython.notebook.insert_cell_{}("{}")
          cell.set_text("{}")
          '''.format(direct, type, text)));
      
      for i in range(3):
          add_cell(f'# heading{i}', 'markdown')
          add_cell(f'code {i}')
      

      上面的代码会添加如下单元格:

      【讨论】:

      • 我收到错误 Javascript Error: IPython is not defined
      猜你喜欢
      • 2022-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2019-06-09
      • 2016-02-04
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多