【问题标题】:Jupyter: trick to run next cell even if previous cell failsJupyter:即使前一个单元失败,也可以运行下一个单元
【发布时间】:2019-12-13 07:50:09
【问题描述】:

如果长时间运行的单元格出现故障,我想发送警报,但我不想尝试/除了因为那样我会在查看错误时发送不必要的消息。有没有办法做到这一点?

所需的工作流程:

1) 运行status=train() 单元格

2) 在前 15 秒内看不到错误

3) 执行下一个单元格send_alert('done or error'),无论单元格 1 的结果如何,该单元格都会执行。

4) 去做点别的事

这是一个每次编码都很烦人的单细胞解决方案:

try:
    start = time.time()
    train(...)
except Exception as e:
    pass
end = time.time()
if end - start > 60: send_alert('done')

【问题讨论】:

  • 您可以使用 nbconvert(请参阅 nbconvert.readthedocs.io/en/latest/…)从 CLI 获取此信息,但您似乎希望以交互方式执行此操作?这看起来像您想要一个装饰器,但对于一个单元格:编写自定义行/单元格魔术对您有用吗?

标签: jupyter-notebook jupyter alerts


【解决方案1】:

这是一个解决方案,具有非常小但可扩展的自定义 iPython 魔术。

你可以把它保存在一个名为magics.py 的文件中,或者有一个 pip 可安装的包。我使用了 pip 可安装的东西:

.
├── magics
│   ├── __init__.py
│   └── executor.py
└── setup.py
# magics/executor.py

import time
from IPython.core.magic import Magics, magics_class, cell_magic

@magics_class
class Exceptor(Magics):

    @cell_magic
    def exceptor(self, line, cell):
        timeout = 2
        try:
            start = time.time()
            self.shell.ex(cell)
        except:
            if time.time() - start > timeout:
                print("Slow fail!")
        else:
            if time.time() - start > timeout:
                print("done")
# magics/__init__.py

from .exceptor import Exceptor

def load_ipython_extension(ipython):
    ipython.register_magics(Exceptor)

这是一个使用它的例子。请注意,%load_ext magics 采用包的名称,然后为您提供名为 %exceptor 的单元格魔法。

【讨论】:

  • 谢谢!这非常有效。使用 flit 制作 pypi 包。
猜你喜欢
  • 2019-10-17
  • 2016-06-23
  • 2020-11-19
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多