用Python执行7zip命令

17

已经有一篇关于这个话题的帖子了,但它并没有明确回答我在这里重新提出的根本问题:

如何从Python中执行7zip命令?

尝试使用subprocess模块,我实现了以下代码,但似乎没有任何操作:

import subprocess
cmd = ['7z', 'a', '"Test.7z"', '"Test"', '-mx9']
subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)

我知道以下的7zip命令是有效的,因为我已经在Windows命令行中测试过:

7z a "Test.7z" "Test" -mx9

我该如何在Python中实现简单的7zip命令?


3
尝试从你的字符串中删除双引号,这可能是问题所在。我认为双引号仅用于告诉shell这些是单个(字面)字符串,并且因为Python已经知道,所以不需要它们。 - stranac
2
为什么不使用PyLZMA - ephemient
7-Zip 9.22 beta 版权所有 (c) 1999-2011 Igor Pavlov 2011-04-18错误:命令行不正确 - nairware
1
去掉双引号就解决了问题。我以为只有因为7zip文档中这样写才需要它们。 - nairware
3个回答

11
import subprocess
cmd = ['7z', 'a', 'Test.7z', 'Test', '-mx9']
sp = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)

6
调用 sp.communicate(),否则如果 7z 生成足够多的输出,可能会导致死锁。或者只需使用 subprocess.check_output() - jfs
1
如果我在Windows GUI中双击运行脚本,那么运行此代码是有效的。然而,如果我尝试从命令行运行相同的脚本,它会给我一个错误:第3行“WindowsError: Error2 The system cannot find the file specified.” 为什么会这样呢? - nairware
1
@nairware 可能是因为它在已知路径中找不到7z。尝试将7z替换为可执行文件的完整路径。 - Matthieu

8
你可以使用以下方式将其包装为函数:

您可以使用以下方式将其作为函数进行封装:

import subprocess

def sevenzip(filename, zipname, password):
    print("Password is: {}".format(password))
    system = subprocess.Popen(["7z", "a", zipname, filename, "-p{}".format(password)])
    return(system.communicate())

这绝对可行,因为我已经尝试并测试过了。如果你想进行微调,例如提取文件,那么可以使用以下方法:
def extractfiles(zipname):
    system = subprocess.Popen(["7z", "e", zipname])
    return(system.communicate())

试试这个方法,然后让我知道你的进展如何。

请注意,此方法适用于Linux。在Windows中,将“7z”替换为“C:\ Program Files \ 7-Zip \ 7z.exe”(我认为这是正确的位置)。


3

以下方法适用于我,使用的是Python 3.5.2和Windows 8.1操作系统,并且已将7z路径添加到系统中。

    rc = subprocess.call(['7z', 'a', output_filename + '.zip', '-mx9', '-pSecret^)'] + [src_folder + '/'])

使用两个参数,-mx9 表示最大压缩,-pSecret^) 表示密码是 "Secret^)","^" 是 ")"的转义字符,在Windows系统中需要输入"^"才能正确解压。
如果没有 "^",在创建zip文件时,Windows系统将不会应用密码。
此外,如果要使用"-mhe"开关,您需要使用7z文件格式而不是zip。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接