【问题标题】:Testing 7-Zip archives from a python script从 python 脚本测试 7-Zip 档案
【发布时间】:2015-12-21 14:01:53
【问题描述】:

所以我有一个 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 中捕获该输出的麻烦。

有没有一种方法可以让我先测试存档,以确定它们是否已损坏?

【问题讨论】:

    标签: python archive 7zip


    【解决方案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.
      '
    )
    

    【讨论】:

    • 'os.system()' 是我调试过程的保留,我在另一个脚本中使用'subprocess.call()' 来保持命令行安静。有什么特别的想法,还是我应该在文档中挖掘?
    • 啊,您对代码的解释非常很有帮助,谢谢!我必须做一些阅读,但这是否适用于以类似于 7-zip 的方法发出响应代码的其他应用程序?
    • @James,是的,应该。如果一个应用程序返回一个代码,它就会提供给调用者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2016-04-12
    相关资源
    最近更新 更多