子进程错误文件

时间:2015-04-22 23:44:27

标签: python error-handling subprocess

我使用python模块subprocess来调用程序,并使用以下命令将可能的std错误重定向到特定文件:

with open("std.err","w") as err:
    subprocess.call(["exec"],stderr=err)

我想要" std.err"只有在出现错误时才会创建文件,但如果没有错误则使用上面的命令,代码将创建一个空文件。 我怎么能让python创建一个文件,只有它不是空的?

我可以在执行后检查文件是否为空并且如果将其删除,但我正在寻找一个"清洁剂"方式。

2 个答案:

答案 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")

将留下一个文件中包含一行文字,或者不留下任何内容。