Подтвердить что ты не робот

Храните ноутбук Jupyter после закрытия вкладки браузера

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

Я предполагаю, что для этого есть обходной путь, но я не могу его найти

4b9b3361

Ответ 1

Простейшим обходным путем для этого является встроенная клеточная магия %%capture:

%%capture output
# Time-consuming code here

Сохранить, закрыть вкладку, вернуться позже. Выход теперь сохраняется в переменной output:

output.show()

Это покажет все промежуточные результаты print, а также явную или богатую выходную ячейку.

Ответ 2

TL; DR:

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

Длинная версия:

К сожалению, это не реализовано (24 ноября). Если есть обходной путь, я тоже не могу его найти. (Все еще ищите, будет обновляться с новостями.) Есть обходной путь, который сохраняет выходные данные, затем перепечатывает их, но не будет работать, если код все еще выполняется в этой записной книжке. Альтернативой может быть второй блокнот, в который вы можете получить вывод.

Мне тоже нужен этот функционал и по той же причине. Ядро не закрывается и не прерывается при закрытии вкладки. И код не перестает работать, когда вы закрываете вкладку. Данное предупреждение совершенно верно: "Ядро занято, выходные данные могут быть потеряны".

Бег

import time
a = 0
while a < 100:
    a+=1
    print(a)
    time.sleep(1)

в одном окне, затем закрыв вкладку, снова открыв ее, а затем запустив

print(a)

из другого окна он будет зависать до тех пор, пока 100 секунд не закончатся и код не завершится, тогда он напечатает 100.

Когда вкладка закрыта, когда вы вернетесь, процесс python будет в том же состоянии, в котором вы его оставили (после последнего сохранения). Это было их предполагаемое поведение, и о чем они должны были быть более понятными в своей документации. Выходные данные из кода выполнения на самом деле отправляются в браузер после повторного открытия (потерял ссылку, объясняющую это), поэтому хаки, подобные приведенному в этом комментарии, будут работать, поскольку они могут получать их и просто выбрасывать их в какую-то ячейку.

Вывод сохраняется только доступным способом через соединение с конечной точкой. Они работали над этим некоторое время (до Jupyter), хотя я не могу найти текущую ошибку в репозитории Jupyter (этот ссылается на нее, но это не так).

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

Смежные вопросы:

Ответ 3

Я тоже борюсь с этой проблемой уже некоторое время.

Мое обходное решение заключалось в том, чтобы записать все мои журналы в файл, чтобы при закрытии моего браузера (действительно, когда много журналов поступает через браузер, он тоже зависает). Я вижу процесс задания ядра, открывая файл журнала ( файл журнала можно открыть, используя Jupyter).

#!/usr/bin/python
import time
import datetime
import logging

logger = logging.getLogger()

def setup_file_logger(log_file):
    hdlr = logging.FileHandler(log_file)
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    hdlr.setFormatter(formatter)
    logger.addHandler(hdlr) 
    logger.setLevel(logging.INFO)

def log(message):
    #outputs to Jupyter console
    print('{} {}'.format(datetime.datetime.now(), message))
    #outputs to file
    logger.info(message)

setup_file_logger('out.log')

for i in range(10000):
    log('Doing hard work here i=' + str(i))
    log('Taking a nap now...')
    time.sleep(1000)

Ответ 4

Сначала установите

runipy

pip install runipy

А теперь запустите вашу записную книжку в фоновом режиме с помощью следующей команды:

nohup runipy YourNotebook.ipynb OutputNotebook.ipynb >> notebook.log &

теперь выходной файл будет сохранен, а также вы сможете увидеть логи при работе с:

tail -f notebook.log