Ipython Notebook writefile同时执行cell

emp*_*uin 7 workflow ipython ipython-notebook

使用魔术单元%%writefile时,似乎ipython将单元格的内容视为纯txt,不会执行。

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

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

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

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

And*_*suk 8

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

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)
Run Code Online (Sandbox Code Playgroud)

您可以在您的 Jupiter 笔记本中声明这一点。将单元格标记为:

%%write_and_run some.py 
Run Code Online (Sandbox Code Playgroud)

或者

%%write_and_run -a some.py 
Run Code Online (Sandbox Code Playgroud)


emp*_*uin 6

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

实际上,您可以按照这篇文章编写自己的魔术命令。使用与 ipython 相关的关键命令是

self.shell.run_cell(cell)
Run Code Online (Sandbox Code Playgroud)

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

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

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