Итак, я написал скрипт развертывания на python, который по сути просто перемещает кучу каталогов. Может быть, а может и не иметь значения, что я работаю в Windows, а сценарии манипулируют файлами и каталогами в общих сетевых ресурсах Windows. Требование этого сценария заключается в том, что он перемещает старый двоичный каталог в папку резервной копии на том же сетевом ресурсе Windows, и именно здесь у меня проблема. Я использую os.renames для этой задачи. Путь назначения генерируется на основе временной метки исполняемого файла в каталоге bin.
exec_mtime = datetime.fromtimestamp(os.path.getmtime(server_exec_path))
new_dirname = os.path.basename(target_path) + '_' + exec_mtime.strftime('%Y-%m-%d_%H.%M.%S')
backup_target_dir = os.path.join(server_old_dir_path, new_dirname)
if not os.path.exists(backup_target_dir):
print("{0}: Backing up old software...".format(server))
os.renames(server_target_path, backup_target_dir)
else:
print("{0}: A backup already exists with the same version number. Skipping backup.".format(server))
Что касается моих переменных:
target_path == "//server/share/path/to/bin"
server_exec_path == os.path.join(target_path, 'Program.exe')
server_old_dir_path == "//server/share/path/to/bin_backup"
Команда os.renames разрешит что-то вродеthis:
os.renames("//server/share/path/to/bin", "//server/share/path/to/bin_backup\\bin_2019-11-01_13.02.27")
Итак, моя проблема в том, что os.renames всегда выдает PermissionError: [WinError 5] Доступ запрещен. Я дважды проверил разрешения на все эти каталоги, и у меня они есть. Вот некоторые вещи, которые я до сих пор пробовал:
- Выполнение тех же действий в файловом браузере Windows. -> Это работает.
- Выполнение той же команды os.renames в оболочке python3 с теми же аргументами, что и сценарий. -> Это работает, запутанно.
- Помещение команды os.renames в цикл, чтобы повторить ее 100 раз в случае сбоя (я где-то читал, что иногда это может помочь). -> Сбой.
- Запуск скрипта в PowerShell с повышенными привилегиями. -> Не удается.
- Удар по моему ноутбуку кувалдой. -> Еще не пробовал.
Еще одна вещь, которую я хочу упомянуть, - это скрипт, который работал даже несколько дней назад. Тем временем я внес некоторые правки, но они не были связаны с этим разделом кода.
У меня нет идей по этому вопросу. Поэтому любая помощь, которую вы можете оказать, будет высоко оценена.