因此,我有一个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中捕获输出的麻烦。
有什么方法我可以先测试档案,以确定它们是否已被破坏?
发布于 2015-09-24 04:40:08
如果遇到问题,7z可执行文件返回两个或更大的值。在批处理脚本中,通常使用errorlevel来检测这一点。不幸的是,Windows下的os.system()给出了用于运行程序的命令解释器的返回值,而不是程序本身的退出值。
如果您想要后者,您可能需要更脏地使用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.
'
)https://stackoverflow.com/questions/32753354
复制相似问题