首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从python脚本中测试7-Zip存档

从python脚本中测试7-Zip存档
EN

Stack Overflow用户
提问于 2015-09-24 04:26:57
回答 1查看 1.4K关注 0票数 1

因此,我有一个python脚本,它的核心是为备份数据而对所选目录进行.7z归档。为了简单起见,我只是通过windows命令行调用了7-zip,如下所示:

代码语言:javascript
复制
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中捕获输出的麻烦。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-24 04:40:08

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

如果您想要后者,您可能需要更脏地使用subprocess模块,而不是使用os.system()调用。

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

代码语言:javascript
复制
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序列以提高可读性):

代码语言:javascript
复制
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.
  '
)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32753354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档