关闭运行代码的IPython Notebook

时间:2013-12-20 09:10:22

标签: python ipython-notebook

它是如何工作的?我在IPython Notebook中运行了一些代码。一些迭代的工作。

无意中我用正在运行的Notebook关闭了浏览器,但是回到IPython Dashboard我发现这个特定的笔记本没有关机,所以如果我再次打开笔记本,我会看到我的代码前面的[*]它正在执行。

我甚至可以听到我的电脑仍在运行代码,但它不会返回任何打印语句的新输出。

我可以等待并最终继续输出,或者我的电脑仍会运行我的代码,但它将无法再访问了吗?

3 个答案:

答案 0 :(得分:4)

当你启动ipython时,它实质上是创建一个在单独进程上运行的Web服务器。代码本身在Web服务器或内核上运行。 Web浏览器只是可以查看和编辑内核代码的几个前端之一。

这种设计允许ipython将代码评估与查看和编辑代码分开 - 例如,我可以通过Web界面(ipython notebook),控制台({{1})访问相同的内核})或qt控制台界面(ipython console)。

您的PC将继续运行代码,但我相信一个前端请求的输出不会显示在使用相同内核的任何其他前端上(尽管我不是100%肯定)。

您可以找到更多信息here

答案 1 :(得分:1)

我现在也在努力解决这个问题。内核在服务器上继续运行您的作业,但在关闭浏览器后无法看到控制台输出。

我的解决方法是将所有日志写入文件,这样当我的浏览器关闭时(实际上当很多日志通过浏览器时它也会挂起)我可以通过打开日志文件看到内核作业进程(日志文件也可以使用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)

答案 2 :(得分:0)

使用此代码将输出保存到文件

import time
from threading import Thread
import sys
#write the stdout to file
def log():
    #for stop the thread
    global run
    while (run):
        try:
            global out
            text = str(sys.stdout.getvalue())
            with open("out.txt", 'w') as f:
                f.write(text)
        finally:
            time.sleep(1)
%%capture out
run = True
print("start")
process = Thread(target=log, args=[]).start()

# do some work
for i in range(10, 1000):
    print(i)
    time.sleep(1)
run= False
process.join()

使用文本编辑器可以使跟踪器更改文件并建议重新加载文件(如 notepad++