如何将Jupyter Notebook单元格中的错误保存到文件中?

问题描述 投票:1回答:1

我试图将单元格的所有输出(标准输出和所有错误)保存到文件中。要保存标准输出,我使用以下内容:

import sys
old_stdout = sys.stdout
sys.stdout = open('test.txt', 'w')
print("Hello World! ")

在这种情况下,输出不会显示,并按预期保存在文件中。为了节省错误,我使用了:

#Doesn't work
sys.stderr = open('error.txt','w')
print(a) #Should raise NameError

当我运行这个单元格时,我在笔记本中得到错误,而不是按预期在文件中:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-5-de3efd936845> in <module>()
      1 #Doesn't work
----> 2 sys.stderr = open('error.txt','w')
      3 print("Test")
      4 print(a)

NameError: name 'sys' is not defined

我希望这保存在一个文件中,而不是在笔记本中显示。这个的正确代码是什么?

python python-2.7 jupyter-notebook
1个回答
2
投票

我认为这里的问题是为笔记本生成的IPython内核使用了一个ZMQInteractiveShell实例,它在将它们转换为stderr之前捕获错误,以便将错误信息发送给各种潜在的前端(控制台,jupyter笔记本等) 。请参阅ipykernel/ipkernel.py#L397-L413获取异常的代码,然后InteactiveShell._showtraceback用于基本实现(打印到sys.stderr),ZMQInteractiveShell._showtraceback用于笔记本内核使用的(通过zmq将stderr-channel消息发送到前端)。

如果你不想获得精确的stderr输出,你可以利用IPython的existing error logging,它将错误记录到带有前缀StreamHandler"Exception in execute request:"。要使用它,请设置ipython日志级别,并更改提供的处理程序的流:

import logging
import sys

my_stderr = sys.stderr = open('errors.txt', 'w')  # redirect stderr to file
get_ipython().log.handlers[0].stream = my_stderr  # log errors to new stderr
get_ipython().log.setLevel(logging.INFO)  # errors are logged at info level

或者,要将shell错误直接打印到文件而不进行更改,您可以修补_showtraceback方法以打印回溯到文件以及zmq消息队列:

import sys
import types

# ensure we don't do this patch twice
if not hasattr(get_ipython(), '_showtraceback_orig'):
    my_stderr = sys.stderr = open('errors.txt', 'w')  # redirect stderr to file
    # monkeypatch!
    get_ipython()._showtraceback_orig = get_ipython()._showtraceback

    def _showtraceback(self, etype, evalue, stb):
        my_stderr.write(self.InteractiveTB.stb2text(stb) + '\n')
        my_stderr.flush()  # make sure we write *now*
        self._showtraceback_orig(etype, evalue, stb)

    get_ipython()._showtraceback = types.MethodType(_showtraceback, get_ipython())
© www.soinside.com 2019 - 2024. All rights reserved.