Shutil.move() не работает с планировщиком задач, несмотря на работу вручную

#python #automation #scheduled-tasks

Вопрос:

Я работаю над использованием планировщика задач для запуска этой программы каждое утро. Программа на python отлично работает, когда я запускаю ее вручную, но выдает файлообменник, когда закончу с планировщиком задач. Вот фрагмент кода:

 original = "C:/Users/work/thing/thing.xlsx"
target = "C:/Users/{}/place of work/work Team - 
Documents/General/thing".format(user)

if os.path.isfile(os.path.join(target, "thing.xlsx")):
    os.remove(os.path.join(target, "thing.xlsx"))

shutil.move(original, target)

print("Program executed without errors.")
 

Комментарии:

1. Под какой учетной записью пользователя у вас настроен планировщик задач для выполнения этого? С какой учетной записью пользователя вы запускаете его при ручном тестировании?

2. Кстати, я был бы очень (чрезвычайно) удивлен, если бы это было характерно для shutil.move и не происходило также с os.rename .

3. Кроме того, вам не должно быть нужно os.remove() … и, если вам это не нужно, у вас не должно быть этого. Переименование файла в место назначения, которое перезаписывает существующий файл, является стандартным способом атомарного обновления этого файла («атомарное» означает, что либо оно завершится успешно, и вы получите новый файл, либо произойдет сбой, и у вас все еще будет старый файл). Когда вы добавляете явное удаление, вы теряете эту атомарность, потому что у вас может быть случай, когда удаление завершается успешно, но переименование завершается неудачно, поэтому в конечном итоге у вас вообще не будет файла в месте назначения.

4. В любом случае-если это не проблема с правами доступа к файлам, то наиболее вероятный запасной вариант-это user значение, которое не соответствует вашим ожиданиям. (Например, если вы читаете имя пользователя из файла, возможно, вы забыли убрать новую строку в конце).

5. @CharlesDuffy — административный пользователь, и это происходит только с операционной системой.переименовать

Ответ №1:

Исправлено путем преобразования скрипта python в исполняемый файл (через pyinstaller), а затем выполнения программы exe в качестве действия из планировщика задач. Некоторые отмеченные галочками свойства включают -«предоставить наивысшие разрешения», в которых я также устранил необходимость shutil.move() , просто создав и записав файл в облачном хранилище.