Workflow Ipython笔记本同时写入文件和执行单元格

Workflow Ipython笔记本同时写入文件和执行单元格,workflow,ipython,ipython-notebook,Workflow,Ipython,Ipython Notebook,当使用magic cell%%writefile时,ipython似乎将单元格内容视为普通txt,并且不会执行它 有没有办法在单元格中运行代码,然后自动将其导出到某个脚本文件 这很有用,因为它使您能够通过编程方式将笔记本与只保留笔记本某些部分的脚本同步 在笔记本中,一些代码只是脚手架,下载笔记本作为py脚本将包括这些不必要的代码。同时,您可能需要重新构造文档,将两个代码块放在一起,而在笔记本中,它们之间有很多草稿内容 丑陋的是,以上所有的事情都可以通过手动复制代码来完成。但这将使未来的维护充满繁

当使用magic cell%%writefile时,ipython似乎将单元格内容视为普通txt,并且不会执行它

有没有办法在单元格中运行代码,然后自动将其导出到某个脚本文件

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

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


丑陋的是,以上所有的事情都可以通过手动复制代码来完成。但这将使未来的维护充满繁琐的重新复制和粘贴工作。

好吧,似乎那些使用ipython的人不在乎我的问题。我想我已经自己解决了这个问题

实际上,您可以编写自己的魔术命令如下。要使用的与ipython相关的关键命令是

self.shell.run_cell(cell)
您可以编写一个神奇的命令,首先使用上述命令执行单元格,然后将单元格内容保存到某个文件中。Ipython将行和单元格参数作为unicode对象传递

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

  • 运行代码
  • 将代码写入-f arg给定的某个文件
  • 如果在arg(str)前面加上-before,则将代码放在str前面
  • 如果给定了-indent arg,则写入单元格的缩进版本

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

    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笔记本上声明。标记单元格,如:

    %%write_and_run some.py 
    


    这太棒了!谢谢这也适用于google colab。非常感谢你。
    %%write_and_run -a some.py