Скрипт Python, который перезагружается в Windows

Я пишу скрипт python, который проверяет, доступна ли новая версия, он удаляет себя, копирует новую версию и перезапускается с теми же аргументами.

Код работает на MacOs (Linux):

def main(args):    
    if _version.__version__ == '1.0.3':
        os.remove(sys.argv[0])
        shutil.copytree('/Users/john/Projects/utils/newcode/updatest/', str(script_dir), dirs_exist_ok=True)        
        print('Updating ...')

        args.insert(0, sys.executable)

        os.chdir(_startup_cwd)
        print('Rerunning ...')
        os.execv(sys.executable, args)


if __name__ == "__main__":
    print('This is a new code!')
    main(sys.argv)

В винде вроде тоже работает, но зависает в cmd пока не нажмешь Enter. Я также пытался использовать Popen, и он ведет себя так же в Windows.

Как правильно это сделать в Windows?


person ybonda    schedule 16.06.2021    source источник


Ответы (1)


Раньше в Windows вы не могли удалить файл, который все еще открыт. Кажется, он недавно изменился (см. этот вопрос), но я бы не рекомендовал полагаться на это, если вы собираетесь распространять свой файл , потому что он не будет работать в старых версиях Windows 10 или версиях Windows, отличных от 10.

Предполагая, что пока ваша программа работает, вы не можете удалить свой собственный исходный файл, чтобы заменить его, другим способом достижения того же результата будет непрямая замена файла. Для этого я вижу два подхода:

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

Основная проблема заключается в том, что Windows несовместима с POSIX, поэтому то, что работает в системах POSIX (Lunix, MacOS,...), не работает в Windows.

person Lenormju    schedule 17.06.2021
comment
Ты прав! Я проверил тот же код на более старой версии, и это не удалось! Благодарю вас! - person ybonda; 17.06.2021
comment
@ybonda, тогда пометьте мой ответ как принятый? :) - person Lenormju; 18.06.2021