【问题标题】:Ipython Notebook writefile and execute cell at the same timeIpython Notebook 写入文件并同时执行单元格
【发布时间】:2015-10-27 01:43:17
【问题描述】:

在使用魔法单元%%writefile时,似乎ipython把单元格的内容当成纯txt,不会执行。

有什么方法可以在单元格中运行代码,然后自动将其导出到某个脚本文件中?

这很有用,因为它使您能够以编程方式将您的笔记本与只保留部分笔记本的脚本同步。

notebook中,有些代码只是脚手架,把notebook下载成py脚本会包含这些不必要的代码。同时,您可能想重新构建文档,将两个代码块放在一起,而笔记本中它们之间有很多草稿内容。

很丑,上面的所有事情都可以通过手动复制代码来完成。但这会使以后的维护充满繁琐的复制和粘贴工作。

【问题讨论】:

    标签: workflow ipython ipython-notebook


    【解决方案1】:

    感谢作者的回答。我认为完整的代码对其他人有用:

    from IPython.core.magic import register_cell_magic
    
    
    @register_cell_magic
    def write_and_run(line, cell):
        argz = line.split()
        file = argz[-1]
        mode = 'w'
        if len(argz) == 2 and argz[0] == '-a':
            mode = 'a'
        with open(file, mode) as f:
            f.write(cell)
        get_ipython().run_cell(cell)
    

    你可以在你的 Jupiter notebook 中声明它。将单元格标记为:

    %%write_and_run some.py 
    

    %%write_and_run -a some.py 
    

    【讨论】:

    • 这太棒了!谢谢!!
    • 这也适用于 google colab。非常感谢。
    【解决方案2】:

    好吧,似乎那些使用 ipython 的人不在乎我的问题。我想我已经自己整理出了解决方案。

    其实你可以在this post之后编写自己的魔法命令。与 ipython 相关的关键命令是

    self.shell.run_cell(cell)
    

    您可以编写一个魔术命令,首先使用上述命令执行单元格,然后将单元格内容保存到某个文件中。 Ipython 会将行和单元格参数作为 unicode 对象传递。

    我已经实现了一个可以完成以下工作的。

    1. 运行代码
    2. 将代码写入 -f arg 给出的某个文件中
    3. 如果给出了 -before arg(a str),则将代码放在该 str 之前。
    4. 如果给出 -indent 参数,则编写单元格的缩进版本

    【讨论】:

      最近更新 更多