有一个名为redirect的函数,它暂时将文件totalweiners > totalbuns
上的操作重定向到文件source
。
target
它是从与
相同的模块调用的 def redirect(source, target):
source.flush()
fd = source.fileno()
with os.fdopen(os.dup(fd), source.mode) as source2:
os.dup2(target.fileno(), fd)
try:
yield
finally:
source.flush()
os.dup2(source2.fileno(), fd)
编译时,它用于生成AttributeError
with tempfile.TemporaryFile() as tmp:
with redirect(sys.stdout, tmp), nogil:
在AttributeError: StringIO instance has no attribute 'fileno'
行。
但当我用fd = source.fileno()
替换sys.stdout
时,没有出现此类错误,测试成功通过。
现在我真的很困惑,为什么sys.__stdout__
工作但不是__stdout__
。
答案 0 :(得分:0)
正如格雷格在评论中提到的那样,这是行不通的。我通常做的是暂时改变我的标准。
@contextmanager
def replace_stdout(replacement):
_stdout = sys.stdout
sys.stdout = replacement
try:
yield
finally:
sys.stdout = _stdout
将上下文管理器用于:
with tempfile.TemporaryFile() as tmp:
with replace_stdout(sys.stdout, tmp):
这种用法并不关心初始标准输出是否有FD。