Храните ноутбук Jupyter после закрытия вкладки браузера
Я использую Jupyter Notebook для запуска серии экспериментов, которые занимают некоторое время.
Некоторые ячейки занимают слишком много времени, чтобы выполнить так, чтобы было нормально, что я хотел бы закрыть вкладку браузера и вернуться позже. Но когда я запускаю прерывания ядра.
Я предполагаю, что для этого есть обходной путь, но я не могу его найти
Ответы
Ответ 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
Ответ 5
https://github.com/NII-cloud-operation/Jupyter-LC_wrapper
Это ядро-обертка сохраняет каждый вывод ячейки в отдельный файл журнала.