Jupyter: трюк для запуска следующей ячейки, даже если предыдущая ячейка не работает

Я хочу отправлять оповещения, если долго работающая ячейка выходит из строя, но я не хочу пытаться/за исключением того, что тогда я буду отправлять ненужные сообщения, когда смотрю на ошибку. Есть ли способ сделать это?

Желаемый рабочий процесс:

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')

person Sam Shleifer    schedule 05.08.2019    source источник
comment
Вы можете использовать nbconvert (см. nbconvert.readthedocs. io/en/latest/), чтобы получить это из интерфейса командной строки, но похоже, что вы хотите сделать это в интерактивном режиме? Похоже, вам нужен декоратор, но для ячейки: сработает ли для вас написание собственной магии строки/ячейки?   -  person colcarroll    schedule 05.08.2019


Ответы (1)


Вот одно из решений с довольно маленькой, но расширяемой пользовательской магией iPython.

Вы можете сохранить его где-нибудь в файле с именем magics.py или иметь пакет, который можно установить в 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.

введите здесь описание изображения

person colcarroll    schedule 05.08.2019
comment
Благодарю вас! Это сработало отлично. Использовал flit для создания пакета pypi. - person Sam Shleifer; 13.08.2019