2009-04-17 5 views
12

Я поддерживаю кросс-платформенное приложение, основанное на PyQt, которое работает на Linux и Mac.Самооценка py2exe/py2app application

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

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

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

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

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

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

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

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

+0

Из интереса, как вы планируете иметь дело с обновлениями, которые охватывают несколько версий/обновлений. например у пользователя есть 1.0, то к моменту их следующего попытки запустить его было (скажем) 10 обновлений? Не могли бы вы создать патчи по требованию? С кэшированием я думаю, что это будет не так уж плохо, но предполагает, что у вас есть код на стороне сервера ... –

+1

Если пользователь пропустил 10 обновлений, программа обновления загрузит 10 патчей, необходимых для перехода к последней версии, и применит их один одним. Отсутствует код на стороне сервера, просто простой сервер apache, отображающий содержимое каталогов. –

ответ

4

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

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

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

+0

Из чистого любопытства, почему исполняемый файл python или любой другой исполняемый файл, впрочем, не поддерживают двоичное исправление? Разве это не двоичный патч, а только файл NewVersion.exe минус OldVersion.exe, причем патч изменяет байты, необходимые для создания NewVersion.exe? – ryeguy

3

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

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

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

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

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

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

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

+1

Приложение составляет 40 МБ * сжато * :) Это все библиотеки DLL и исполняемые файлы python, которые используют большую часть его, мой код составляет всего 500 КБ. –

1

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

+0

Иногда вы также хотите обновлять библиотеки DLL (например, при изменении версии Qt, добавлении зависимостей модулей расширения и т. Д.), Я не хочу проверять вручную, если все работает каждый раз, когда я делаю выпуск. –

0

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

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

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

Смежные вопросы