Как удаленно обновлять приложения Python
Каков наилучший метод для внесения изменений в программу, написанную на Python? У меня есть часть программного обеспечения, написанная на Python, которая будет регулярно обновляться. Каков был бы лучший способ сделать это? Все машины будут иметь Windows 7.
Также извините за двусмысленность моего вопроса. Это будет мой первый раз, когда я буду внедрять процедуру обновления. Не стесняйтесь упоминать подробности, которые вы хотели бы, чтобы я добавил.
4 ответа
Если вы еще не упаковываете свою программу с InnoSetup, я настоятельно рекомендую вам перейти на нее, потому что она имеет средства, облегчающие подобные вещи. В сценарии InnoSetup вы можете указать любые особые ситуации, например, файлы, которые не следует обновлять, если они уже существуют (например, если у вас есть какие-либо внутренние файлы конфигурации или тому подобное).
Затем, чтобы позволить клиентскому компьютеру узнавать о новых версиях вашего приложения, сохраните очень маленький файл на общедоступном веб-сервере с номером версии текущего выпуска и URL-адресом установщика exe последней версии. Чтобы этот файл был полезен, всякий раз, когда вы выпускаете более новую версию вашей программы, вы должны обновить этот файл, а также номер версии в сценарии InnoSetup, а также некоторую константу APP_VERSION в вашей программе.
Затем вам нужно самостоятельно обработать следующие части программы обновления:
- Обнаружение, когда доступна более новая версия, путем извлечения файла текущей версии с вашего веб-сервера по протоколу HTTP и сравнения номера версии там с собственным APP_VERSION приложения. Удостоверьтесь, что этот запрос выполняется изящно, если клиентский компьютер не имеет доступа к Интернету, и который не блокирует графический интерфейс во время выполнения запроса (в случае возникновения проблемы в сети, которая заставляет запрос ждать долгое время для перерыва).
- Если доступна более новая версия, спросите пользователя, хотят ли они обновить, и если он скажет "да", загрузив обновленный установщик в каталог TEMP. В зависимости от того, какой инструментарий GUI вы используете, существуют различные механизмы для отображения диалога прогресса во время загрузки; это хорошая идея, так как установщик, вероятно, будет по крайней мере MB.
- Закрытие приложения, запуск специального сценария обновления в фоновом режиме, а затем снова запуск приложения.
Сценарий обновления будет ожидать полного прекращения работы исходного процесса (самый простой способ сделать это - передать PID исходного процесса в качестве аргумента командной строки и сделать так, чтобы скрипт обновления отправлял сигнал запроса 0 этому процессу каждую секунду или около того, пока Уходит.) Затем он может запустить установщик в фоновом режиме, возможно, при отображении диалогового окна "Пожалуйста, подождите..." для пользователя. После того, как установщик завершит работу и сообщит об успехе в своем коде возврата, программа обновления может перезапустить вашу программу.
В зависимости от того, насколько велико ваше приложение, пропускная способность будет расточительнее, чем метод с использованием git или другого SCM. Каждое обновление с этим подходом будет включать в себя загрузку всего установщика для последней версии приложения, в то время как SCM будет загружать только файлы, которые изменились. Однако его преимущество заключается в том, что он не требует специальных серверных средств, кроме обычного веб-сервера, и не требует специальной установки клиента SCM на компьютер пользователя.
Плюс, InnoSetup просто классный.:-)
Я бы предложил использовать программу контроля версий, такую как git или subversion. Кроме того, если вы согласны с тем, что все видят код, вы можете опубликовать код на github, где каждый может его извлечь. Вы можете сделать его приватным, но вам придется заплатить за него, и все пользователи также должны будут создать учетную запись github и настроить его с помощью своей установки git.
Если вы используете программу управления исходным кодом, другие люди должны будут отредактировать изменения вручную, выполнив команду, но вы можете создать пакетный файл сценария pr, который делает это и запускает его при запуске или через равные промежутки времени.
Просто для ясности, если вы хотите сделать это, вам придется поместить код на сервер с поддержкой SSH и настроить git. Если вы не хотите проходить через все настройки сервера, я бы порекомендовал github.
git- http://git-scm.com/ (для версии Windows перейдите в раздел загрузки и выберите msysGit)
github - https://github.com/
Для тех из вас, кто хотел бы заняться чем-то менее устаревшим, я просто смотрел, как создавать приложения на Python, которые можно обновлять удаленно (хотя и не ограничиваясь Windows, например OP).
Похоже, какое-то время это было странным решением. Хотя он устарел с 2018 года.
Последнее и самое актуальное решение, похоже, представляет собой комбинацию pyinstaller и pyupdater. Обратите внимание, что у меня нет личного опыта с этим, я ищу друга.
Кажется, он поддерживает Windows, Linux и Mac, а также Python 2 и 3, поэтому определенно стоит взглянуть.
Основные принципы обновления приложений хорошо описаны в ответе DSimon .
Однако безопасность обновлений — это совсем другое дело: вы не хотите, чтобы ваши клиенты в конечном итоге устанавливали вредоносные файлы.
PyUpdater, как предложено в ответе jlengrand , действительно обеспечивает некоторые функции безопасного обновления, но, к сожалению, PyUpdater 4.0 не работает , и более полугода (сейчас август 2022 г.) не было нового выпуска.
Также есть python-tuf, эталонная реализация The Update Framework (TUF). ТУФ (python-tuf
) делает все возможное для обеспечения безопасного распространения файлов обновлений. Однако он не обрабатывает специфичные для приложения вещи, такие как проверка новых версий приложения и установка на стороне клиента.