gpt4 book ai didi

python - 如何从 Python 中的标准输出重定向转义

转载 作者:太空宇宙 更新时间:2023-11-04 07:49:59 25 4
gpt4 key购买 nike

我想处理第三方脚本的实时输出,打印一些与模式匹配但跳过其他行的行:

def thirdparty_code():
from random import choice
stuff = ['keep: important stuff', 'ignore: boring stuff']
while True:
chosen_line = choice(stuff)
print(chosen_line)

我使用 redirect_stdout(将行传递到我的虚拟 IO)和一个扩展的 StringIO(用作 IO 但也调用我的过滤函数)。但是,当我在我的处理函数中调用 print() 时,我得到了一个 RecursionError - 这并不意外:

from io import StringIO
from contextlib import redirect_stdout

class StringIOWithCallback(StringIO):

def __init__(self, callback, **kwargs):
super().__init__(**kwargs)
self.callback = callback

def write(self, s):
super().write(s)
self.callback(s)

def filter_boring_stuff_out(line):
if line.startswith('ignore'):
return
print(line)

my_io = StringIOWithCallback(filter_boring_stuff_out)

with redirect_stdout(my_io):
thirdparty_code()

我想知道是否有可能从重定向中逃脱,例如在 print() 函数中指定 file 参数,以便它打印到实际的标准输出。我知道我可以轻松地使用标准错误流:

import sys
print(line, file=sys.stderr)

但我特别想使用标准输出。有没有一种很好的 pythonic 方式来做到这一点?

最佳答案

在重定向 stdout 之后,您可以轻松地重置它,这要归功于 __stdout__ 保存了原始值。

sys.stdout = redirected_stdout
...
...
sys.stdout = sys.__stdout__

如果你不断地发现自己切换这些输出流,你应该创建一个函数来输出到重定向的流:

def redirect(*args):
print(*args, file=redirected_file)

redirect(...) # redirect this output
print(...) # use standard stream

关于python - 如何从 Python 中的标准输出重定向转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56260336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com