子进程错误文件

Subprocess error file

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

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

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

我可以在执行后检查文件是否为空,以防删除它,但我一直在寻找 "cleaner" 方式。

您可以使用 Popen,检查标准错误:

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)

附带说明一下,如果您关心 return 代码,您应该使用 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)

您可以创建自己的上下文管理器来为您处理清理工作——您实际上无法执行您在此处描述的操作,这归结为询问您如何展望未来。像这样(更好的错误处理等):

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

要么留下一个只有一行文本的文件,要么什么都不留下。