Самостоятельное обновление приложения py2exe / py2app

Я поддерживаю кросс-платформенное приложение, основанное на PyQt, которое работает на mac и windows linux.

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

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

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

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

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

[Обновить]

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

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

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

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

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

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

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

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

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

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

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

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

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

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