我使用python模块subprocess
来调用程序,并使用以下命令将可能的std错误重定向到特定文件:
with open("std.err","w") as err:
subprocess.call(["exec"],stderr=err)
我想要" std.err"只有在出现错误时才会创建文件,但如果没有错误则使用上面的命令,代码将创建一个空文件。 我怎么能让python创建一个文件,只有它不是空的?
我可以在执行后检查文件是否为空并且如果将其删除,但我正在寻找一个"清洁剂"方式。
答案 0 :(得分:2)
你可以使用Popen,检查stderr:
from subprocess import Popen,PIPE
proc = Popen(["EXEC"], stderr=PIPE,stdout=PIPE,universal_newlines=True)
out, err = proc.communicate()
if err:
with open("std.err","w") as f:
f.write(err)
在旁注中,如果您关心应使用check_call
的返回代码,则可以将其与NamedTemporaryFile
结合使用:
from tempfile import NamedTemporaryFile
from os import stat,remove
from shutil import move
try:
with NamedTemporaryFile(dir=".", delete=False) as err:
subprocess.check_call(["exec"], stderr=err)
except (subprocess.CalledProcessError,OSError) as e:
print(e)
if stat(err.name).st_size != 0:
move(err.name,"std.err")
else:
remove(err.name)
答案 1 :(得分:0)
您可以创建自己的上下文管理器来为您处理清理工作 - 您无法真正完成您在此处所描述的内容,这可以归结为询问您如何展望未来。这样的事情(更好的错误处理等):
import os
from contextlib import contextmanager
@contextmanager
def maybeFile(fileName):
# open the file
f = open(fileName, "w")
# yield the file to be used by the block of code inside the with statement
yield f
# the block is over, do our cleanup.
f.flush()
# if nothing was written, remember that we need to delete the file.
needsCleanup = f.tell() == 0
f.close()
if needsCleanup:
os.remove(fileName)
......然后是:
with maybeFile("myFileName.txt") as f:
import random
if random.random() < 0.5:
f.write("There should be a file left behind!\n")
将留下一个文件中包含一行文字,或者不留下任何内容。