Не срабатывает команда "zip" в os.system
Учу питон с помощью книги A byte of python. Дошла уже до раздела решение задач. Там есть вот такой код:
import os
import time
# 1. Файлы и каталоги, которые необходимо скопировать, собираются в список.
source = ['"C://Users/IVANINBOX/Documents/"', 'C://Users//IVANINBOX/Code']
# Заметьте, что для имён, содержащих пробелы, необходимо использовать
# двойные кавычки внутри строки.
# 2. Резервные копии должны храниться в основном каталоге резерва.
target_dir = 'C://Users/IVANINBOX/Backup' # Подставьте ваш путь.
# 3. Файлы помещаются в zip-архив.
# 4. Именем для zip-архива служит текущая дата и время.
target = target_dir + os.sep + time.strftime('%Y%m%d%H%M%S') + '.zip'
# 5. Используем команду "zip" для помещения файлов в zip-архив
zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))
# Запускаем создание резервной копии
print(zip_command)
if os.system(zip_command) == 0:
print('Резервная копия успешно создана в', target)
else:
print('Создание резервной копии НЕ УДАЛОСЬ')
В выводе получается:
zip -qr C://Users/IVANINBOX/Backup\20200824120643.zip
"C://Users/IVANINBOX/Documents/" C://Users//IVANINBOX/Code
"zip" �� ���� ����७��� ��� ���譥�
��������, �ᯮ��塞�� �ணࠬ��� ��� ������ 䠩���.
Создание резервной копии НЕ УДАЛОСЬ
Именно с такими непонятными знаками...
Когда я вставляю в коммандную строку выведенную команду zip_command,(ее я получила с помощью print(zip_command)) все срабатывает, и Архив сохздается. Подскажите, пожалуйста, что не так?
Ответы (2 шт):
Гадать можно долго, но начать надо с элементарной обработки ошибки. В доке на os.system() читаем:
On Windows, the return value is that returned by the system shell after running command.
Значит, для начала нужно немного подправить Ваш код. К примеру, так:
error = os.system(zip_command)
if error == 0:
print('Резервная копия успешно создана в', target)
else:
print('Создание резервной копии НЕ УДАЛОСЬ')
print('Error = ', error)
И посмотрите, что означает напечатанный код ошибки. Возможно, это сразу пиведёт Вас к решению проблемы.
И ещё... Мне не понятен вот этот участок кода:
source = ['"C://Users/IVANINBOX/Documents/"', 'C://Users//IVANINBOX/Code']
Почему первый элемент списка в двойной паре '"..."', а второй - в одинарной '...' ? В этом есть какой-то смысл?
Мне помогло указание полного пути к GnuWin32:
zip_command = r'""C:\Program Files (x86)\GnuWin32\bin\zip.exe" -r {0} {1}"'.format(target, ' '.join(source))
Альтернатива, если делать через 7-Zip:
zip_command = r'""C:\Program Files\7-Zip\7z.exe" a -tzip -ssw -mx5 -r0 {0} {1}"'.format(target, ' '.join(source))
Полный код:
import os
import time
source = [r'C:\byteofpy\notes']
target_dir = r'C:\byteofpy\backup'
target = target_dir + os.sep + time.strftime('%Y%m%d%H%M%S') + '.zip'
if not os.path.exists(target_dir):
os.mkdir(target_dir)
zip_command = r'""C:\Program Files (x86)\GnuWin32\bin\zip.exe" -r {0} {1}"'.format(target, ' '.join(source))
print('Zip command is:')
print(zip_command)
print('Running:')
if os.system(zip_command) == 0:
print('\nSuccessful backup to', target)
else:
print('\nBackup FAILED')