Ipython Notebook writefile同时执行单元格

时间:2015-10-27 01:43:17

标签: workflow ipython ipython-notebook

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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 

%%write_and_run -a some.py 

答案 1 :(得分:3)

嗯,似乎那些使用ipython的人并不关心我的问题。我想我已经自己解决了这个问题。

实际上,您可以在this post之后编写自己的魔术命令。与ipython相关的关键命令是

self.shell.run_cell(cell)

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

我已经实现了以下工作。

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