从 python 脚本测试 7-Zip 压缩文件

Testing 7-Zip archives from a python script

所以我有一个 python 脚本,其核心是为选定目录制作 .7z 存档以备份数据。为了简单起见,我只是通过 windows 命令行调用了 7-zip,如下所示:

def runcompressor(target, contents):
print("Compressing {}...".format(contents))
archive = currentmodule
archive += "{}\{}.7z".format(target, target)
os.system('7z u "{}" "{}" -mx=9 -mmt=on -ssw -up1q0r2x2y2z1w2'.format(archive, contents))
print("Done!")

如果不存在则创建一个新存档,如果存在则更新旧存档,但如果出现问题,存档将损坏,如果此命令命中现有的损坏存档,它只会给出向上。现在 7zip 有一个用于测试存档完整性的命令,但是文档没有提到提供输出,然后在 python.

中捕获该输出的麻烦来了

有什么方法可以让我先测试档案,以确定它们是否已损坏?

如果遇到问题,7z 可执行文件 return 的值为 2 或更大。在批处理脚本中,您通常会使用 errorlevel 来检测这一点。不幸的是,Windows 下的 os.system() 给出了用于 运行 您的程序的命令解释器的 return 值,而不是程序本身的退出值。

如果你想要后者,你可能不得不使用 subprocess 模块,而不是使用 os.system() 调用。

如果您有 3.5 版(或更高版本),这很简单:

import subprocess as sp
x = sp.run(['7z', 'a', 'junk.7z', 'junk.txt'], stdout=sp.PIPE, stderr=sp.STDOUT)
print(x.returncode)

在我的例子中 junk.txt 是一个真实的文件,但 junk.7z 只是我的一个文本文件的副本,因此是一个无效的存档。该程序的输出是 2,因此如果出现问题很容易检测到。

如果您打印出 x 而不仅仅是 x.returncode,您会看到类似的内容(重新格式化并删除了 \r\n 序列以提高可读性):

CompletedProcess(
  args=['7z', 'a', 'junk.7z', 'junk.txt'],
  returncode=2,
  stdout=b'
    7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
    Error: junk.7z is not supported archive
    System error:
    Incorrect function.
  '
)