簡體   English   中英

為什么 IPython 不調用 sys.stderr.flush()?

[英]Why doesn't IPython call sys.stderr.flush()?

我正在使用 Python logging模塊並通過使用此 class 的實例覆蓋sys.stderrstderr重定向到日志文件...

# Redirect stderr to main_logger using this class
    class CustomWriter:
        def __init__(self, logger, level):
            self.buffer = ''
            self.logger = logger
            self.level = level

        def write(self, message):
            self.buffer += message

        def flush(self):
            if self.buffer != '':
                for line in self.buffer.split('\n'):
                    self.logger.log(self.level, line)
                self.buffer = ''

當我將代碼作為腳本運行時它工作正常,但是當我使用 IPython 在交互模式下運行相同的代碼時它不會記錄任何內容,我認為是因為 IPython 從不調用sys.stdoutflush()方法,如下所示.

import sys
sys.stderr.flush = lambda: print("flushed")
raise Exception("This is a test")

上面的代碼作為腳本運行時...

Traceback (most recent call last):
flushed
  File "C:/_MyFiles/Projects/git_projects/fto-util/scratch.py", line 3, in <module>
flushed
    raise Exception("This is a test")
flushed
Exception: This is a test
flushed

Process finished with exit code 1

當與 vanilla Python 以交互模式運行時...

>>> import sys
>>> sys.stderr.flush = lambda: print("flushed")
flushed
>>> raise Exception("This is a test")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: This is a test
flushed

使用 IPython...

In [1]: import sys
In [2]: sys.stderr.flush = lambda: print("flushed")
In [3]: raise Exception("This is a test")
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-3-f2b5a8ce26d8> in <module>
----> 1 raise Exception("This is a test")

Exception: This is a test

IPython 是在這里做一些棘手的事情,還是我只是對sys.stderr的行為方式做出了無效的假設? 我應該如何解決這個問題?

暫無
暫無

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

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