Поэтому я написал сценарий развертывания на 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 разрешится примерно так:

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

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

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

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

1
MasterGeek 6 Ноя 2019 в 20:23

1 ответ

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

1
MasterGeek 6 Ноя 2019 в 20:45