当前位置: 首页 > 面试题库 >

临时重定向标准输出/标准错误

周阳成
2023-03-14
问题内容

是否可以在Python中临时重定向stdout / stderr(即在方法期间)?

编辑:

当前解决方案的问题(我最初记得但后来忘记了)是它们没有 重定向
;相反,它们只是完全替换了流。因此,如果某个方法由于某种原因(例如,由于将流作为参数传递给某物)而具有该变量的 本地 副本,则该方法将无效。

有什么办法吗?


问题答案:

要解决某些函数可能已将sys.stdout流作为局部变量缓存的问题,因此替换全局变量sys.stdout在该函数内部不起作用的问题,可以在文件描述符级别(sys.stdout.fileno())进行重定向,例如:

from __future__ import print_function
import os
import sys

def some_function_with_cached_sys_stdout(stdout=sys.stdout):
    print('cached stdout', file=stdout)

with stdout_redirected(to=os.devnull), merged_stderr_stdout():
    print('stdout goes to devnull')
    some_function_with_cached_sys_stdout()
    print('stderr also goes to stdout that goes to devnull', file=sys.stderr)
print('stdout is back')
some_function_with_cached_sys_stdout()
print('stderr is back', file=sys.stderr)

stdout_redirected()将所有输出重定向sys.stdout.fileno()到给定的文件名,文件对象或文件描述符(os.devnull在示例中)。



 类似资料:
  • 问题内容: 我有一个奇怪的问题,如果可以解决,那就太好了。出于调试目的(以及其他一些目的),我在标准输出上编写了控制台Java应用程序的日志。在标准输出上写一些内容,在标准错误上打印一些错误,例如错误。问题是这两个没有完全同步,因此打印线的顺序并不总是正确的。我猜这是因为打印了很多东西,并且碰巧一个输出的缓冲区已满,所以其他输出在第一个输出刷新其缓冲区之前就已打印出来。 例如,我想这样写: 有时打

  • 我是Java的初学者。学习罗伯特·塞奇威克的《Java导论》 我尝试在Netbeans中编译以下代码。 } 我收到了这个错误。我已将文件放置在标准位置。java 线程“main”java.lang.RuntimeException中的异常:无法编译的源代码-错误的sym类型:示例。StdIn.is在示例中为空。verage.main(verage.java:16)Java结果:1 BUILD SU

  • 问题内容: 我知道Java中有一个函数可以使用method 将标准输出流设置为任何用户定义的值。 但是,是否有任何方法可以将标准输出重置为先前存储的标准输出还是标准输出? 问题答案: 您可以通过持有标准的文件描述符。要重置标准以打印到控制台,您可以 另一种方法是仅保留原始对象,如下所示:

  • 问题内容: 我有一个封闭的源程序,可以将输出打印到标准输出。我需要解析输出。因此,我使用dup2将输出重定向到FIFO(可以在分叉并执行二进制文件的父进程中从中读取),然后执行该程序。问题是文件中的fprintf调用被缓冲了,因为它现在正在写入文件。 我尝试在调用exec之前在sdout上使用_IONBF调用setvbuf。但是问题仍然存在。 为什么setvbuf对我的情况没有帮助? 我如何强制输

  • 问题内容: 在bash中,调用将在stdout上显示该命令的任何输出。 调用会将该命令的任何输出重定向到指定的文件(在本例中为“输出”)。 有没有一种方法可以将输出重定向到文件 并 在stdout上显示? 问题答案: 您想要的命令名为 : 例如,如果您只关心标准输出: 如果要包括stderr,请执行以下操作: 将通道2(stderr /标准错误)重定向到通道1(stdout /标准输出),以便将两

  • 和之前 inputs/stdin 插件一样,outputs/stdout 插件也是最基础和简单的输出插件。同样在这里简单介绍一下,作为输出插件的一个共性了解。 配置示例 output { stdout { codec => rubydebug workers => 2 } } 解释 输出插件统一具有一个参数是 workers。Logstash 为输