簡體   English   中英

如何將Jupyter Notebook單元中的錯誤保存到文件中?

[英]How to save errors from Jupyter Notebook cells to a file?

我正在嘗試將單元格的所有輸出(stdout和所有錯誤)保存到文件中。 為了保存標准輸出,我使用以下命令:

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

我希望將其保存在文件中,而不在筆記本中顯示。 正確的代碼是什么?

認為這里的問題是為筆記本計算機生成的IPython內核使用ZMQInteractiveShell實例,該實例在將錯誤傳遞給stderr之前捕獲了錯誤,以便將錯誤信息發送到各種潛在的前端(控制台,jupyter筆記本計算機等)。 。 ipykernel / ipkernel.py#L397-L413針對捕獲異常,則代碼InteactiveShell._showtraceback為基實現(印刷到sys.stderr )和ZMQInteractiveShell._showtraceback對於由筆記本內核使用(通過發送標准錯誤信道消息zmq到前端)。

如果您不擔心獲得准確的stderr輸出,則可以利用IPython 現有的錯誤日志記錄 ,該日志記錄將錯誤記錄到帶有前綴"Exception in execute request:"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

另外, _showtraceback您的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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM