Команды 7zip из Python

В этой теме уже есть сообщение, но оно есть не имеют явного ответа на фундаментальный вопрос, который я повторно задаю здесь:

Как вы делаете команды 7zip из Python?

Пытаясь использовать модуль 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

Как мне реализовать эту простую команду 7zip из Python?


person nairware    schedule 16.06.2012    source источник
comment
Попробуйте удалить двойные кавычки из ваших строк. Это может быть проблемой. Я считаю, что они используются только для того, чтобы сообщить оболочке, что это одиночные (буквальные) строки, и они не нужны, поскольку python уже знает это.   -  person stranac    schedule 17.06.2012
comment
Почему бы не использовать PyLZMA?   -  person ephemient    schedule 17.06.2012
comment
('\r\n7-Zip 9.22 beta Copyright (c) 1999-2011 Игорь Павлов 2011-04-18\r\n\r\n\r\nОшибка:\r\nНеверная командная строка\r\n', Нет )   -  person nairware    schedule 17.06.2012
comment
Удаление двойных кавычек помогло. Я предположил, что они необходимы только потому, что так сказано в документах 7zip.   -  person nairware    schedule 17.06.2012


Ответы (3)


Вы можете обернуть его как функцию, используя следующее:

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» (думаю, это правильное место).

person Naufal    schedule 02.04.2017
comment
Это должен быть ответ. Из любопытства, знаете ли вы, как настроить 7-Zip, чтобы для этого решения не требовался администратор? - person Pylander; 14.03.2018
comment
Честно говоря, я не знаю. Я искал некоторые ответы, но все они, похоже, указывали на установку, а не на запуск 7z. - person Naufal; 16.03.2018

У меня работает следующий: в систему добавлен путь python 3.5.2, windows8.1, 7z

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

С двумя параметрами, -mx9 означает максимальное сжатие, -pSecret^) означает, что пароль "Secret^)" , "^" является экранированием для ")" для системы Windows, но при распаковке потребуется ввести "^" .

Без «^» система Windows не будет применять пароль при создании ZIP-файла 7z.exe.

Кроме того, если вы хотите использовать ключ «-mhe», вам нужен формат файла 7z вместо zip.

person zqcolor    schedule 20.10.2016

person    schedule
comment
вызовите sp.communicate(), иначе он может зайти в тупик, если 7z выдаст достаточно вывода. Или просто используйте subprocess.check_output() - person jfs; 17.06.2012
comment
Запуск этого кода работает, если я запускаю сценарий, дважды щелкнув его в графическом интерфейсе Windows. Однако, если я попытаюсь запустить тот же сценарий из командной строки, он выдаст ошибку: Строка 3 WindowsError: Error2 Система не может найти указанный файл. С чего бы это? - person nairware; 17.06.2012
comment
@nairware, вероятно, потому, что не может найти 7z по известным ему путям. Попробуйте заменить 7z на полный путь к исполняемому файлу. - person Matthieu; 09.11.2015