'архивируйте' работы в оболочке, но не в сценарии Python

Согласно этому сообщению я звоню zip использование команды os.system() в Python.

В командной строке это работает:

zip -r /Backups/backups/20152011-120209{.zip,}

Когда я называю это из сценария Python (PATH "/Backups/backups/20152011-120209"),

os.system("zip -r " + PATH + "{.zip,}")

Это бросает:

zip error: Nothing to do! (/Backups/backups/20152011-122909{.zip,})

Что я делаю неправильно?

Я хочу архивировать каталог (включая его содержание) к zip-файлу с тем же именем в том же месте (сценарий выводит мои базы данных MySQL в *.sql файлы, и я хочу архивировать файлы после этого).

0
задан 13 April 2017 в 15:24

1 ответ

Прежде, чем добраться до проблемы, я заключу комментарий Jacob Vlijm в кавычки в соответствии с этим ответом (спасибо за комментарий и за ссылку):

[...] использование os.system вообще является действительно плохой идеей. Устаревший и удержанный от использования. Используйте subprocess.call () или подпроцесс. Popen () вместо этого.

Здесь является первым (или один из первых) предложение по депрекации, отнесся ко времени 2010.

Таким образом, необходимо действительно использовать subprocess.Popen() вместо os.system().


Когда Вы работаете os.system() команда выполняется в Тире (/bin/sh), в то время как при выполнении команды в терминале, команда выполняется в Bash (/bin/bash);

Тире не поддерживает расширение фигурной скобки и интерпретирует {.zip,} буквально;

Выполните команду в Bash: изменение

os.system("zip -r " + PATH + "{.zip}")

кому:

os.system("bash -c 'zip -r " + PATH + "{.zip,}'")

Или так или иначе поскольку Darael предлагает передачу FWIW /Backups/backups/20152011-120209{.zip,} расшириться /Backups/backups/20152011-120209 кому: /Backups/backups/20152011-120209.zip и /Backups/backups/20152011-120209 Вы могли бы также просто передать пути, непосредственно старающиеся не порождать другую оболочку:

os.system("zip -r " + PATH + ".zip " + PATH)
2
ответ дан 26 July 2019 в 15:11

Другие вопросы по тегам:

Похожие вопросы: