gpt4 book ai didi

python - 使用上下文管理器将脚本输出重定向到文件?

转载 作者:太空宇宙 更新时间:2023-11-03 15:25:06 25 4
gpt4 key购买 nike

我正在编写一个脚本,我有一个选项,可以在命令行上传递,脚本是否应该将其结果打印到标准输出或预定义的结果文件。下面显示了一个代码概要。我现在已经阅读了一些关于 Python 中的上下文管理器的内容,但我不确定是否以及如何在这种特定情况下使用上下文管理器。所以我正在寻求建议

  1. 在此问题中使用上下文管理器是否有意义
  2. 如何着手实现。

所以,没有上下文管理器的代码是:

option_file = True # would come from OptionParser in real code

if option_file:
out = open("resultsfile", "w")
else:
out = sys.stdout

# do some computations
out.write("Results of script")
# more computations and calls to out.write

if option_file:
out.close()

最佳答案

上下文管理器是可以与 with 语句一起使用的东西。它明确设计用于:

  • 执行一些设置,
  • 给你一个对象,然后
  • 再次执行一些拆卸(即使您引发异常)。

例如,open 可以用作上下文管理器。在下面的代码中

with open(...) as f:
# do stuff

stuff 是什么并不重要,文件将始终关闭。 (好吧,通常。除了一些愚蠢的情况,比如电源被关闭或进程被杀死。)

在这种情况下,您应该使用上下文管理器。在我看来它不像你,所以我认为没有理由使用上下文管理器。


有一种替代方法(没有更好或更坏,只是不同)使用上下文管理器编写代码。如果您想暂时重定向 stdout —— 但要确保在完成后恢复它 —— 那么你就是上述情况。这是一个例子:

@contextlib.contextmanager
def redirect_stdout(stream):
import sys
sys.stdout = stream
yield
sys.stdout = sys.__stdout__

然后你可以写这样的代码

with open(...) as f:
with redirect_stdout(f):
# do stuff

并且在 stuff 中对 stdout 的任何写入都将转至 f


编辑:您是正确的,没有办法有条件地拥有上下文管理器:您要么在其中,要么不在其中。您可以随时编写自己的代码,但可能什么都不做:

@contextlib.contextmanager
def maybe_open(path, do_nothing=True):
if do_nothing:
f = None
yield sys.stdout
else:
f = open(path)
yield f

if f:
f.close()

这几乎可以肯定是矫枉过正。

关于python - 使用上下文管理器将脚本输出重定向到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8495422/

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