Самостоятельно обновляемое приложение py2exe / py2app - PullRequest
12 голосов
/ 17 апреля 2009

Я поддерживаю кроссплатформенное приложение, основанное на PyQt, которое работает на Linux Mac и Windows.

Версии для Windows и Mac распространяются с использованием py2exe и py2app, которые производят довольно большие пакеты (~ 40 МБ).

Я хотел бы добавить функцию «автоматического обновления», основанную на исправлениях, для ограничения размера загрузок:

  • проверить наличие новых версий на http-сервере
  • скачать патчи, необходимые для обновления до последней версии
  • применить список исправлений и перезапустить приложение

У меня есть несколько вопросов:

  • Каков предпочтительный способ обновления приложения Windows, поскольку открытые файлы заблокированы и не могут быть перезаписаны?
  • как мне подготовить и применить патчи? возможно, используя bsdiff / pspatch ?

[обновление]

Я создал простой класс для создания патчей с помощью bsdiff , что очень эффективно, как рекламируется на их сайте: diff для двух версий моего приложения py2exe (~ 75 МБ без сжатия) выдает патч 44 КБ ! Достаточно маленький для меня, я буду придерживаться этого формата.

Код доступен в пакете 'update' pyflu , небольшой библиотеки кода Python.

Ответы [ 5 ]

4 голосов
/ 17 апреля 2009

Я не верю, что py2exe поддерживает исправленные обновления. Однако, если вы не упакуете весь пакет в один EXE-файл ( пример веб-сайта py2exe - внизу страницы), вы можете получить небольшие обновления, просто заменив определенные файлы , например EXE-файл, например. Это может значительно уменьшить размер ваших обновлений.

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

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

3 голосов
/ 17 апреля 2009

Я не знаю о патчах, но в OS X «стандарт» для приложений с какао - Sparkle . В основном это делает "appcasting". Он загружает полное приложение каждый раз. Возможно, стоит посмотреть на это для вдохновения.

Я полагаю, что в OS X вы, вероятно, можете просто загрузить фактическую часть вашего пакета приложений, которая содержит ваш конкретный код (не библиотеки и т. Д., Которые входят в комплект), и это было бы довольно мало и легко заменить в комплекте.

В Windows вы, вероятно, сможете сделать аналогичный трюк, не объединяя ваше приложение в один exe-файл, что позволит вам изменить один файл, который фактически изменился.

Я бы предположил, что ваш реальный код Python будет гораздо меньше, чем 40 МБ, так что, вероятно, это путь.

Что касается замены запущенного приложения, сначала нужно найти его местоположение, чтобы вы могли использовать sys.executable, чтобы получить отправную точку, затем вы, вероятно, могли бы разветвить дочерний процесс, уничтожить родительский процесс и получить ребенок делает фактическую замену?

В настоящее время я играю с небольшим приложением wxPython и задаюсь вопросом, какова именно эта проблема. Я хотел бы услышать о том, что вы придумали.

Кроме того, насколько велико ваше приложение при сжатии? Если он хорошо сжимается, возможно, вы все равно можете позволить себе отправить все это.

2 голосов
/ 09 июля 2013

Сейчас 4 года, а как насчет Esky ?

1 голос
/ 17 апреля 2009

Поскольку py2exe помещает все скомпилированные модули вашего приложения в ZIP-файл, вы можете попытаться обновить этот файл, создав скрипт, который обновляет его из заданного набора файлов. Затем замените оставшиеся файлы, которые изменились (их должно быть немного, если они есть).

0 голосов
/ 14 декабря 2017

Старый пост, но я решил упомянуть pyupdater с pyinstaller.

Поддерживает Amazon и scp.

В будущем, согласно последним сообщениям на github, они планируют поддерживать бесплатные альтернативы.

...