2012-06-16 4 views
3

Существует post на эту тему уже, но это не имеет четкий ответ на фундаментальный вопрос, который я повторно спрашивает здесь: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?

+2

Попробуйте удалить двойные кавычки из ваших строк. Это может быть проблемой. Я считаю, что они используются только для того, чтобы сообщать оболочке о единственных (буквальных) строках и не нужны, поскольку python уже это знает. – stranac

+2

Почему бы не [PyLZMA] (http://www.joachim-bauch.de/projects/pylzma/)? – ephemient

+0

('\ r \ n7-Zip 9.22 beta Авторское право (c) 1999-2011 Игорь Павлов 2011-04-18 \ r \ n \ r \ n \ r \ nError: \ r \ nНеверная командная строка \ r \ n', Нет) – nairware

ответ

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

вызов 'sp.communicate()' else он может зайти в тупик, если '7z' производит достаточный вывод. Или просто используйте 'subprocess.check_output()' – jfs

+1

Выполнение этого кода работает, если я запускаю скрипт, дважды щелкнув по нему в графическом интерфейсе Windows. Однако, если я попытаюсь запустить тот же скрипт из командной строки, это дает мне ошибку: строка 3 «WindowsError: Error2 Система не может найти указанный файл». Почему это должно быть? – nairware

+0

@nairware, вероятно, потому, что он не может найти 7z внутри своих знанных путей. Попробуйте заменить 7z на полный путь к исполняемому файлу. – Matthieu

0

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

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

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

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

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

0

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

import os 
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» (я думаю, это подходящее место).

Смежные вопросы