子进程错误文件
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")
要么留下一个只有一行文本的文件,要么什么都不留下。
我正在使用 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")
要么留下一个只有一行文本的文件,要么什么都不留下。