Подтвердить что ты не робот

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

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

Старый пост, но я подумал, что я бы назвал pyupdater с pyinstaller.

Он поддерживает Amazon и scp.

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