暂时重定向 stdout/stderr
是否可以在Python中临时重定向stdout/stderr(即在方法期间)?
编辑:
当前解决方案的问题(我一开始记得但后来忘记了)是它们不重定向;相反,它们只是完全替换了流。因此,如果一个方法出于任何原因(例如,因为流作为参数传递给某个东西)而具有一个变量的本地副本,则该方法将不起作用。
有什么解决办法吗?
Is it possible to temporarily redirect stdout/stderr in Python (i.e. for the duration of a method)?
Edit:
The problem with the current solutions (which I at first remembered but then forgot) is that they don't redirect; rather, they just replace the streams in their entirety. Hence, if a method has a local copy of one the variable for any reason (e.g. because the stream was passed as a parameter to something), it won't work.
Any solutions?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
您还可以将重定向逻辑放在上下文管理器中。
You can also put the redirection logic in a contextmanager.
从 python 3.4 开始,有上下文管理器
contextlib .redirect_stdout
:要完全静音
stdout
,此方法有效:starting from python 3.4 there is the context manager
contextlib.redirect_stdout
:to completely silence
stdout
this works:要解决某些函数可能已将 sys.stdout 流缓存为局部变量并因此替换全局 sys.stdout 无法在该函数内工作的问题,您可以在文件描述符级别重定向(
sys.stdout.fileno()
),例如:stdout_redirected()
重定向sys.stdout.fileno()
的所有输出给定的文件名、文件对象或文件描述符(示例中的os.devnull
)。stdout_redirected()
和merged_stderr_stdout()
在此定义。To solve the issue that some function might have cached
sys.stdout
stream as a local variable and therefore replacing the globalsys.stdout
won't work inside that function, you could redirect at a file descriptor level (sys.stdout.fileno()
) e.g.:stdout_redirected()
redirects all output forsys.stdout.fileno()
to a given filename, file object, or file descriptor (os.devnull
in the example).stdout_redirected()
andmerged_stderr_stdout()
are defined here.我不确定临时重定向是什么意思。但是,您可以像这样重新分配流并将其重置回来。
还可以像这样在 print stmts 中写入 sys.stderr 。
常规打印将输出到标准输出。
I am not sure what temporary redirection means. But, you can reassign streams like this and reset it back.
Also to write to sys.stderr within print stmts like this.
Regular print will to stdout.
可以使用如下所示的装饰器:
使用 as:
或者,如果您不想修改
fun
的源代码,请直接将其调用为但请注意,这不是线程安全的。
It's possible with a decorator such as the following:
Use as:
or, if you don't want to modify the source for
fun
, call it directly asBut note that this is not thread-safe.
这是我发现很有用的上下文管理器。这样做的好处是您可以将它与
with
语句一起使用,并且它还可以处理子进程的重定向。我创建此内容的上下文位于 这篇博文。
Here's a context manager that I found useful. The nice things about this are that you can use it with the
with
statement and it also handles redirecting for child processes.The context for why I created this is at this blog post.
Raymond Hettinger 向我们展示了一种更好的方法[1]:
在 with 块之后,sys.stdout 将被重置
[1 ]: <一href="http://www.youtube.com/watch?v=OSGv2VnC0go&list=PLQZM27HgcgT-6D0w6arhnGdSHDcSmQ8r3" rel="nofollow noreferrer">http://www.youtube.com/watch?v=OSGv2VnC0go&list=PLQZM27HgcgT-6D0w6arhnGdSHDcSmQ8r3
Raymond Hettinger shows us a better way[1]:
After the with block the sys.stdout will be reset
[1]: http://www.youtube.com/watch?v=OSGv2VnC0go&list=PLQZM27HgcgT-6D0w6arhnGdSHDcSmQ8r3
查看 contextlib.redirect_stdout(new_target) 和 contextlib.redirect_stderr(new_target)。
redirect_stderr
是 Python 3.5 中的新增功能。Look at contextlib.redirect_stdout(new_target) and contextlib.redirect_stderr(new_target).
redirect_stderr
is new in Python 3.5.我们将使用 ob_startPHP 语法python3中的a>和ob_get_contents函数,并重定向输入到一个文件中。
输出存储在文件中,也可以使用任何类型的流。
用途:
打印
We'll use the
PHP
syntax of ob_start and ob_get_contents functions in python3, and redirect the input into a file.The outputs are being stored in a file, any type of stream could be used as well.
Usage:
Would print