【发布时间】:2021-02-22 12:03:36
【问题描述】:
我有以下 Python(2.7) 代码:
try:
FNULL = open(os.devnull,'w')
subprocess.check_call(["tar", "-czvf", '/folder/archive.tar.gz', '/folder/some_other_folder'], stdout=FNULL, stderr=subprocess.STDOUT)
except Exception as e:
print str(e)
我面临的问题是,当档案没有更多空间时,print str(e) 打印Command '['tar', '-czvf', '/folder/archive.tar.gz', '/folder/some_other_folder']' returned non-zero exit status 1,这是真的,但我想在这里找到真正的错误,即gzip: write error: No space left on device(我当我手动运行相同的 tar 命令时出现此错误)。这有可能吗?我假设 gzip 是 tar 中的另一个进程。我错了吗?请记住,无法升级到 Python 3。
编辑:我也尝试使用 subprocess.check_output() 并打印 e.output 的内容,但这也没有用
【问题讨论】:
-
一般来说,“退出状态 1”是唯一真正明确的机器可读错误。 stderr 内容可以包含任何诊断日志记录或人类可读的信息内容,而不仅仅是错误 - 因此遵循@ShadowRanger 所写的答案,虽然不是错误,但可能会导致处理错误之前的日志消息好像它们本身就是错误的一部分。
-
...所以,f/e,当您在 shell 中写入
if tar -czvf folder.archive.gz /folder; then ...; else echo "There was an error" >&2; fi时,shell 依靠退出状态来知道出现问题并遵循else分支。 -
@CharlesDuffy:我的回答只在退出状态为非零时回显
stderr,所以当然,发生错误时您可能会看到诊断输出,但在正常情况下它会保持沉默(成功) 状况。绝对不依赖stderr是否为空/非空。 -
@ShadowRanger,如果您正在检查空/非空标准错误,您将投反对票;我的立场是谨慎、合格的支持之一。
标签: python python-2.7 subprocess