我有一个大致如下结构的Python函数,它计算一些结果并将它们写入文件:
results = []
with open(filename, "w") as output:
for item in items:
result = compute_stuff(item)
write_result(item, result, output)
results.append(result)
return results
Run Code Online (Sandbox Code Playgroud)
现在我并不总是想将结果写入文件 - 有时我只想计算它们并让它们返回.使"write_result"成为条件很容易,但是还有一种方法可以使"with"语句中的文件创建与条件相关吗?(我知道我可以明确地处理文件的打开和关闭,但是我会产生"try/finally"开销,创建"with"语句以避免.)
有一个优雅的解决方案吗?
编辑添加:
我可能过于简化了示例.我没有写任意文件,而是使用matplotlib.backends.backend_pdf.PdfPages(链接),并在每一步中添加一个图(PDF中的新页面).特别是,这意味着我无法重新打开PDF文件PdfPages,因为它会被覆盖.
我正在编写一个与工作流管理器一起使用的包装类.我想以subprocess.Popen某种方式记录应用程序的输出(通过执行的子进程):
stdout孩子应该去一个日志文件和stdout父母的,stderr该子项应该转到不同的日志文件,但也应该转到stdout父项.即所有来自孩子的输出应该最终合并stdout(比如subprocess.Popen(..., stderr=subprocess.STDOUT),因此我可以保留stderr来自包装器本身的日志消息.另一方面,孩子的流应该转到不同的文件以允许单独的验证.
我尝试使用"Tee"帮助程序类将两个流(stdout和日志文件)绑定在一起,以便Tee.write写入两个流.但是,这不能传递给Popen因为"subprocess"使用OS级函数进行编写(参见http://bugs.python.org/issue1631).
我当前的解决方案(下面的代码片段,主要是从这里调整)的问题是输出stdout可能不会以正确的顺序出现.
我怎么能克服这个?或者我应该使用完全不同的方法?(如果我坚持下面的代码,我如何选择一个字节数的值os.read?)
import subprocess, select, sys, os
call = ... # set this
process = subprocess.Popen(call, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
logs = {process.stdout: open("out.log", "w"), process.stderr: open("err.log", "w")}
done = {process.stdout: False, process.stderr: False}
while (process.poll() is None) or (not all(done.values())):
ready = select.select([process.stdout, process.stderr], [], [])[0]
for …Run Code Online (Sandbox Code Playgroud)