在非交互模式下运行IPython/Jupyter笔记本

87
有人知道是否可以从命令行以非交互方式运行IPython/Jupyter笔记本,并将运行结果保存为.ipynb文件吗?如果现在还不可能,使用phantomJS实现、打开/关闭内核和Web服务器的功能会有多难?
更具体地说,假设我已经有一个笔记本original.ipynb,我想重新运行该笔记本中的所有单元并将结果保存在一个新笔记本new.ipynb中,但是希望只需在命令行上输入一个命令即可完成操作,无需在浏览器中进行任何交互或关闭内核或Web服务器,并且假设没有正在运行的内核或Web服务器。
示例命令: $ ipython notebook run original.ipynb --output=new.ipynb

Ploomber(https://github.com/ploomber/ploomber)就是答案!因此,您可以使用它将笔记本转换为.py脚本,自动化输出为.ipynb或HTML报告。在幕后,我们使用nbconvert,但添加了更多功能,如增量构建。您可以将所有输出笔记本参数化(已运行)到单个位置,甚至将它们转换为其他格式。它还节省了用户进入生产过程时的大部分重构时间。 - Ido Michael
6个回答

76
是的,这是可能的,并且很容易。它将(基本上)成为IPython核心2.0的一部分。我建议现在先查看那些示例。[编辑]
$ jupyter nbconvert --to notebook --execute original.ipynb --output=new.ipynb

现在可以在Jupyter NbConvert中使用了。NbConvert带有一组默认禁用的Preprocessor,其中两个(ClearOutputPreprocessorExecutePreprocessor)比较有用。您可以通过在本地或全局配置文件中启用c.<PreprocessorName>.enabled=True(大写是Python),或在命令行中输入--ExecutePreprocessor.enabled=True并保持其余命令不变来启用它们。

--ExecutePreprocessor.enabled=True还有一个方便的--execute别名,可在最新版本的NbConvert中使用。如果需要可以与--inplace结合使用。

例如,在运行笔记本的头部之后将其转换为HTML:

$ jupyter nbconvert --to=html --execute RunMe.ipynb

在剥离输出后转换为PDF

$ ipython nbconvert --to=pdf --ClearOutputPreprocessor.enabled=True RunMe.ipynb

这当然也适用于非Python内核,它会生成一个<insert-your-language-here>内核,如果您设置了--profile=<your fav profile>。转换可能需要很长时间,因为需要重新运行笔记本。您可以使用--to=notebook选项进行笔记本与笔记本之间的转换。

根据用例可能需要设置/取消各种其他选项(超时、允许错误等)。有关更多信息,请参见文档和当然是jupyter nbconvert --help--help-allnbconvert在线文档


1
@Matt 这个功能已经添加到ipython2里了吗?如果是,我该怎么使用它呢? - Simon Byrne
3
不,IPython 2中没有,但正在IPython 3的开发之中。 - Matt
7
现在看起来是这样的(Ipython 3.1.0):“ipython nbconvert --to=html --execute RunMe.ipynb” - patricksurry
6
尝试使用--ExecutePreprocessor.timeout=-1命令(参考链接:http://nbconvert.readthedocs.io/en/latest/execute_api.html#execution-arguments-traitlets),它可以取消执行超时限制。 - Lenna
5
最新版的Jupyter(4.1.0)确实可以非交互方式运行notebook,命令为jupyter nbconvert --to notebook --execute --allow-errors notebook.ipynb,也许答案可以进行编辑。 - mgalardini
显示剩余8条评论

21

在此功能成为核心的之前,我制作了一个小型命令行应用程序,可以实现您想要的功能。它被称为runipy,您可以使用pip install runipy进行安装。源代码和自述文件在github上


runipy 对我来说似乎效果不太好: 它没有更新 signature 字段,结果(我认为这是一个结果),我的所有 SVG 都没有被渲染:IPython 更喜欢显示简单的 __repr__ 文本呈现方式。 - akim

2

运行并替换原始的.ipynb文件:

jupyter nbconvert --ExecutePreprocessor.timeout=-1 --to notebook --inplace --execute original.ipynb

1
为了涵盖一些功能,例如并行工作者、输入参数、电子邮件发送或S3输入/输出...您可以安装jupyter-runner。
pip install jupyter-runner

在Github上的Readme: https://github.com/omar-masmoudi/jupyter-runner


0

另一种方法是使用papermill,它有命令行界面

用法示例:(您需要指定执行结果的输出路径)

papermill your_notebook.ipynb logs/yourlog.out.ipynb

如果您希望,还可以使用-p标志为每个参数指定所需参数:

papermill your_notebook.ipynb logs/yourlog.out.ipynb -p env "prod" -p tests "e2e"

与papermill回复相关的另一个问题- https://dev59.com/2VsW5IYBdhLWcg3wCTeB#55458141


-5

您可以通过命令行直接运行iPython-Notebook服务器:

ipython notebook --pylab inline

这将以非交互模式启动服务器,并将所有输出打印在代码下方。然后,您可以保存包括代码和输出的.ipynb文件。


谢谢您的回复,但我正在寻找一种更具体的解决方案,它不需要在Web浏览器中进行干预,也不需要关闭内核和Web服务器。我编辑了问题以使其更具体。 - davidshinn
在这种情况下,我不知道该怎么做。您计划定期执行此操作吗?iPython-Notebook旨在在浏览器中交互使用,从命令行保存特定的ipynb文件对我来说似乎相当奇怪。 - ala
是的,如果有这个功能,我计划经常使用它。在数据源经常变化且我想要查看使用pandas生成的代码和诊断输出交错的情况下,它将非常有用,这正是ipython笔记本非常擅长的。然而,如果我需要运行许多此类进程,最好能够批量运行,然后稍后查看输出,就像生成日志文件一样。标准日志记录的问题在于很难看到代码和输出交错在一起。 - davidshinn
4
对我来说,这似乎是一个非常实用的用例。你可以拿一个模板笔记本,稍微调整一下参数,然后在不触碰浏览器的情况下得到一个可打印的完全执行解决方案。 - holdenweb

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