如何因异常处理而截断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"
答案 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。