如何在Python中捕获stderr?

时间:2018-09-07 09:22:10

标签: python

我想捕获从python模块A生成的错误消息。 A用C ++和SWIG编写,因此我无法捕获Python的sys.stderr

>>> import A
>>> A.func() # this prints an error message by C++ std::cerr.
this is an error message from module A

我想做的是抑制错误消息并根据错误类型更改脚本行为。但是A.func()不会返回错误号。


假设我在下面使用的contextlib是正确的,则没有帮助。

>>> import io
>>> f = io.StringIO()
>>> import contextlib
>>> with contextlib.redirect_stderr(f):
... no_return = A.func()
ERROR MESSAGE HERE
>>> f.getvalue()

>>>

1 个答案:

答案 0 :(得分:0)

谢谢@ PM2Ring

https://eli.thegreenplace.net/2015/redirecting-all-kinds-of-stdout-in-python/#id1

稍作修改:将所有stdout替换为stderr,并如下所示支持macOS,它可以按预期运行。

if sys.platform == 'darwin':
    c_stderr = ctypes.c_void_p.in_dll(libc, '__stderrp')
else:
    c_stderr = ctypes.c_void_p.in_dll(libc, 'stderr')