所以我有一个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中捕获输出的麻烦。
我是否可以先测试档案,以确定档案是否已损坏?
答案 0 :(得分:1)
7z
可执行文件遇到问题时返回值为2或更大的值。在批处理脚本中,通常使用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.
'
)