Python 3 os.renames Доступ запрещен только при использовании в скрипте - PullRequest
1 голос
/ 06 ноября 2019

Итак, я написал скрипт развертывания на 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] Доступ запрещен. Я дважды проверил разрешения на все эти каталоги, и у меня они есть. Вот некоторые вещи, которые я до сих пор пробовал:

  1. Выполнение тех же действий в файловом браузере Windows. -> Это работает.
  2. Выполнение той же команды os.renames в оболочке python3 с теми же аргументами, что и сценарий. -> Это работает, запутанно.
  3. Помещение команды os.renames в цикл, чтобы повторить ее 100 раз в случае сбоя (я где-то читал, что иногда это может помочь). -> Сбой.
  4. Запуск скрипта в PowerShell с повышенными привилегиями. -> Не удается.
  5. Удар по моему ноутбуку кувалдой. -> Еще не пробовал.

Еще одна вещь, которую я хочу упомянуть, - это скрипт, который работал даже несколько дней назад. Тем временем я внес некоторые правки, но они не были связаны с этим разделом кода.

У меня нет идей по этому вопросу. Поэтому любая помощь, которую вы можете оказать, будет высоко оценена.

1 Ответ

1 голос
/ 06 ноября 2019

Как оказалось, проблема была побочным эффектом изменений, которые я внес в свой скрипт. Я использую python для запуска команды psexec на том же удаленном компьютере ранее в сценарии (для локального запуска taskkill, чтобы обновляемое программное обеспечение могло корректно завершиться), и я использовал флаг -u, который меняет пользователя, с которым командаработает на удаленной машине. Когда я убрал флаг -u, os.renames снова начал работать. Так что я предполагаю, что запуск psexec каким-то образом изменил пользователя, которого скрипт python использует при запуске os.renames.

...