Поэтому я написал сценарий развертывания на 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. Я дважды проверил разрешения на все эти каталоги, и они у меня есть. Вот некоторые вещи, которые я пробовал до сих пор:
- Выполнение тех же действий в файловом браузере Windows. -> Это работает.
- Запуск той же команды os.renames в оболочке python3 с теми же аргументами, что и сценарий. -> Это работает, сбивчиво.
- Поместите команду os.renames в цикл, чтобы повторить ее 100 раз, если она не удалась (я где-то читал, что иногда это может помочь). -> Это не удается.
- Запуск скрипта в PowerShell с повышенными правами. -> Это не удается.
- Ударил мой ноутбук кувалдой. -> Еще не пробовал.
Еще хочу отметить, что скрипт работал еще несколько дней назад. Тем временем я внес некоторые правки, но они не были связаны с этим разделом кода.
У меня нет идей на этот счет. Поэтому любая помощь, которую вы можете предоставить, будет высоко оценена.
1 ответ
Как оказалось, проблема была побочным эффектом изменений, которые я внес в свой скрипт. Я использую python для запуска команды psexec на той же удаленной машине ранее в сценарии (для локального запуска taskkill, чтобы обновляемое программное обеспечение могло корректно завершить работу), и я использовал флаг -u, который меняет пользователя, с которым выполняется команда. работает на удаленной машине. Когда я удалил флаг -u, os.renames снова начал работать. Итак, я предполагаю, что каким-то образом запуск psexec изменил пользователя, который скрипт python использует при запуске os.renames.
Похожие вопросы
Новые вопросы
python-3.x
НЕ ИСПОЛЬЗУЙТЕ, ЕСЛИ ВАШ ВОПРОС ТОЛЬКО ДЛЯ PYTHON 3. Всегда используйте вместе со стандартным тегом [python].