截断sys.stderr

时间:2016-11-18 14:20:11

标签: python-2.7

如何因异常处理而截断sys.stderr

import sys
try:
    sys.stderr.write('Someone written here')
    raise Exception
except:
    # would like to clean sys.stderr here
    sys.stderr.write('I only want this')
    sys.exit(1)

我希望标准错误只包含字符串"I only want this"

1 个答案:

答案 0 :(得分:2)

这样的事可以帮助你吗?只有到目前为止只向stderr打印过一行时才会有效:Python - Remove and Replace Printed items

另一种方法是将stderr附加到一个字符串并将其打印到finally中,尽管这不允许您实时增量打印。

import sys

stderr_str = ''
try:
    stderr_str += 'Someone written here'
    raise Exception
except:
    # would like to clean sys.stderr here
    stderr_str = ''
    stderr_str += 'I only want this'
finally:
    sys.stderr.write(stderr_str)

编辑: 您还可以尝试将stderr重新定义为类文件对象,详细内容为in this answer。即使第三部分模块写入stderr,这也应该有效。

示例:

bash-3.2$ ls
a.py    b.py
bash-3.2$ cat a.py
import sys
import b

sys.stderr = open('stderr.log', 'a')
b.raise_exception()

bash-3.2$ cat b.py
def raise_exception():
    return 1/0

bash-3.2$ python a.py
bash-3.2$ ls
a.py        b.py        b.pyc       stderr.log
bash-3.2$ cat stderr.log
Traceback (most recent call last):
  File "a.py", line 5, in <module>
    b.raise_exception()
  File "/Users/username/tmp2/b.py", line 2, in raise_exception
    return 1/0
ZeroDivisionError: integer division or modulo by zero

您基本上可以使用这样的技术捕获所有stderr直到结束,然后将其写入stderr,或者只是忽略它并将新输出写入stderr。