如何在 Jupyter 笔记本中通过编程创建多个新单元格

7
我希望您能使用编程方式在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)

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

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

2个回答

21

我在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)

希望这能帮助到某个人;)


请提供将一些代码以编程方式放入新单元格的示例。 - WestCoastProjects
@WestCoastProjects 你可以这样使用该函数:create_new_cell('print(123)')。这是你想要的吗? contents 参数可以是任何 Python 代码字符串。 - braunmagrin
有没有一种方法可以创建Markdown文本? - Juan Osorio
1
@braunmagrin - 有没有办法执行它? - bluesummers
这段代码什么都没做。我在我的Jupyter Notebook中运行它,命令是create_new_cell("print('Hello world!')") - Jaideep Shekhar
真是太棒了!非常非常有创意,谢谢你。 - Chris

1
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}')

上面的代码将添加单元格,如下所示:enter image description here

3
我收到了一个错误信息:Javascript错误:IPython未定义。 - Javier Lopez Tomas
我得到了空输出。 - filups21

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接