已关闭正在运行代码的IPython笔记本。

6
它是如何工作的?我在IPython笔记本中运行了一些代码,进行了一些迭代工作。意外地关闭了带有正在运行的Notebook的浏览器,但返回到IPython仪表板后,我看到这个特定的Notebook还没有关机,所以如果我再次打开Notebook,我会看到[*]在我正在执行的代码前面。
我甚至可以听到我的电脑仍在运行代码,但它不会给我任何新的print语句输出。
我能等待并最终继续输出,还是我的电脑仍然运行我的代码,但不再可访问?

是的,一旦您关闭浏览器,它就不再显示输出。一个解决方案是将STDout重定向到文件,以便稍后访问它。请参见相关帖子:https://dev59.com/4V4b5IYBdhLWcg3wchTs#29170902 - Peter
3个回答

4
当你启动ipython时,它本质上是创建了一个运行在单独进程上的Web服务器。代码本身正在Web服务器或内核上运行。Web浏览器只是几个前端之一,可以查看和编辑内核上的代码。
这种设计允许ipython将代码的评估与代码的查看和编辑分离--例如,我可以通过Web界面(ipython notebook)、控制台(ipython console)或qt控制台界面(ipython qtconsole)访问同一个内核。
您的PC将继续运行代码,但我认为一个前端请求的输出不会显示在使用相同内核的任何其他前端上(不过我对此并不100%确定)。
您可以在此处找到更多信息。

这是有用的信息,谢谢。如果我理解正确,内核保持活动状态,前端是灵活的。但这表明我可以使用另一个前端再次访问内核。但是,如果Notebook处于[*]阶段,如何获取%connect_info呢? - Mattijn
4
目前我们有一个限制,当您关闭 HTML 页面时,JavaScript 会丢失关于哪个单元格将在未来接收哪个输出的信息(这些储存在回调函数中),我们将在将来解决这个问题。其中唯一能做的事情是使用 Out[<a number>] 重新访问以前的输出。 - Matt
当我关闭浏览器时,* 就消失了。我怎么知道它是否仍在运行? - jwillis0720
一种可能性是在计算机上运行top命令,查看Python代码是否仍在运行。 - Devil
当通过菜单命令“运行全部”来运行整个笔记本时,情况如何?执行会在一个单元格后停止吗? - IanS

2

我也一直在苦恼这个问题。内核在服务器上运行你的作业,但关闭浏览器后就无法查看控制台输出。

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

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++


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接