当造纸厂生成笔记本时,会在输出路径中创建一个.ipynb文件,指出它未在jupyter主页中运行。我希望当笔记本完成执行后,它仍然与实时内核一起运行,以便我可以与其中的任何变量进行交互。相反,现在我必须重新运行单元格以获取笔记本中生成的变量。这对于任何时间密集型笔记本来说都特别麻烦。
我正在使用execute_notebook函数生成笔记本。
我的感觉是这是不可能的,因为在执行新笔记本时,它永远不会在我的 jupyter 主页中显示"正在运行"。我所要求的是纸厂可以实现的,还是有另一种可扩展的方法来实现这一点?
您可以通过按照扩展的造纸厂文档来实现这一点,以实现链接到实时内核的自定义引擎,或者在执行后保留内核。这将需要一些自定义代码来避免nbconvert停止内核和/或将目标内核传递到造纸厂的执行函数中。可能,但不是开箱即用。
保持内核运行听起来确实很有用,我也在 Papermill 文档中找不到对此的支持。
内核似乎可能无法使用任何用户界面运行,例如,您可以浏览到的任何本地端口,因此即使它在执行后保持运行,您也无法与之交互。
但是,似乎您无需在保存的笔记本中重新运行任何内容即可恢复已计算的变量,因为您可以简单地使用papermill.read_notebook
,不是吗?
据我所知,有几种选择。Papermill 曾经允许使用 papermill.record()
在笔记本中记录变量,这已被弃用;我相信您可以获得旧版本并仍然使用它。
他们建议的另一种选择是使用剪贴簿。您可以在此处找到有关它的更多信息。
您还可以使用%store
魔法:在 IPython 笔记本之间共享数据
最后,您可以使用python的上下文管理器功能简单地写入平面文件:
with open('<dir>', 'w') as file:
file.write(<var_of_choice>)
import json
with open(<out_path>, "a+") as file:
json.dump(<var_of_choice>, file)
如果笔记本加载大量数据,则让内核保持运行可能不是最佳的。
这在造纸厂中是不可能的(没有太多的额外工作(,因为它在单独的进程中运行您的代码。
但是,你可以用ploomber-engine
来做到这一点;它类似于papermill
,只是它在同一进程中运行笔记本,允许你在笔记本运行后从笔记本中提取变量。
from ploomber_engine.ipython import PloomberClient
# initialize client
client = PloomberClient.from_path("notebook.ipynb")
# this will run the notebook and expose all the variables/functions
namespace = client.get_namespace()
# extract variables or any other object
some_variable = namespace["some_variable"]
some_function = namespace["some_function"]
assert var == 42
assert some_function(1, 41) == 42
下面是一个完整的示例。