Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 2, 2007 21:15:36

astoon
От:
Зарегистрирован: 2007-04-09
Сообщения: 335
Репутация: +  2  -
Профиль   Отправить e-mail  

Обновление программы по сети

Работает следующая система:
1. Относительно большая сеть Ethernet со статическими IP.
2. Клиентское приложение на wxPython. Метод развертывания - py2exe -> Inno Setup. Небольшая часть клиентов сидит под Линуксами, для них соответственно - простой архив с описанием требуемых библиотек.
3. Серверное приложение - на Zope 3, с вэб-интерфейсом для администратора.

Что имеем на сегодняшний день:
1. Клиентское приложение имеет конфиг (реализованный для большего быстродействия как SQLite-база), который часто требуестя изменять.
2. Программа стучится на сервер, проверяет нужно ли обновиться и обновляет свой конфиг.
3. Серверное приложение различает клиентов по IP, и для каждого имеет свою конфигурацию для выдачи её клиентам.

Что хочется сделать:
На данный момент программа-клиент обновляет только свою SQLite-базу. А хотелось бы, что бы он могла и сама обновиться. То есть фактически, реализовать автоматическую сетевую установку новых модулей для программы (соответственно, новые wxPython окна), с попутным появлением новых разделов меню или новых кнопок в главном окне.

Позволит ли сделать это windows-клиент, собранный при помощи py2exe, и как ?
Возможно ли извернуться так, чтобы эта же установка работала и у Linux-клиентов ?



Офлайн

#2 Сен. 2, 2007 23:56:56

umup
От:
Зарегистрирован: 2007-07-14
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Обновление программы по сети

может все обновляемые функции вынести в модули и обновлять только нужные модули ?



Офлайн

#3 Сен. 3, 2007 06:37:13

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Обновление программы по сети

1) какой дистрибутив линукса?
2) лучше создавать два дистрибутива: для винды - exe или msi, а для линукса свои пакеты, стандарные для этого дистрибутива. так же для линукса, можно работать с *.egg



Офлайн

#4 Сен. 3, 2007 08:47:58

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Обновление программы по сети

1) Избавится от py2exe. Python в .msi, AFAIR, позволяет делать неинтерактивную установку, так что поставить при помощи INNO Setup/nsis будет возможность.
2) Обновлять либо при помощи к-л системы контроля версий (bzr, hg, svn - не суть важно), либо яйцами (setuptools/.egg).
3) Избавится от конфига в SQLite, бинарные конфиги это плохо.



Офлайн

#5 Сен. 3, 2007 12:24:53

astoon
От:
Зарегистрирован: 2007-04-09
Сообщения: 335
Репутация: +  2  -
Профиль   Отправить e-mail  

Обновление программы по сети

j2a
1) Избавится от py2exe. Python в .msi, AFAIR, позволяет делать неинтерактивную установку, так что поставить при помощи INNO Setup/nsis будет возможность.
Не могли бы поподробнее сказать как это будет выглядеть ?
j2a
2) Обновлять либо при помощи к-л системы контроля версий (bzr, hg, svn - не суть важно), либо яйцами (setuptools/.egg).
Существует ли вариант связывания API к-л системы контроля версий с собственой программой (то есть по нажатию кнопки “Обновить” в окне программы) ?
j2a
3) Избавится от конфига в SQLite, бинарные конфиги это плохо.
По большому счету это не конфиг, а именно база данных, просто мы здесь привыкли так ее называть :)



Отредактировано (Сен. 3, 2007 12:25:24)

Офлайн

#6 Сен. 3, 2007 12:33:14

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Обновление программы по сети

под виндой самообновление py2exe программы проблематично.
можно сделать простой батник, который будет делать автоматизацию этого процесса перед запуском собственно вашей программы. что-то типа такого

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1033



Офлайн

#7 Сен. 3, 2007 12:38:09

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Обновление программы по сети

astoon
j2a
1) Избавится от py2exe. Python в .msi, AFAIR, позволяет делать неинтерактивную установку, так что поставить при помощи INNO Setup/nsis будет возможность.
Не могли бы поподробнее сказать как это будет выглядеть ?
В инсталлятор кладете python<version>.msi и свое приложение. В процессе инсталляции автоматом ставите Python, а потом в %PYTHONDIR/Lib/site-packages/ – своё приложение. Делаете нужные скрипты, ссылки и т.д.

j2a
2) Обновлять либо при помощи к-л системы контроля версий (bzr, hg, svn - не суть важно), либо яйцами (setuptools/.egg).
Существует ли вариант связывания API к-л системы контроля версий с собственой программой (то есть по нажатию кнопки “Обновить” в окне программы) ?
Вполне. Упомянутые выше Mercurial и Bazaar написаны на Python и имеют соответствующие API. К Subversion есть Python-биндинги.



Офлайн

#8 Сен. 3, 2007 12:58:40

astoon
От:
Зарегистрирован: 2007-04-09
Сообщения: 335
Репутация: +  2  -
Профиль   Отправить e-mail  

Обновление программы по сети

j2a, спасибо, похоже этот вариант самый подходящий.

Но вот еще:

bialix
под виндой самообновление py2exe программы проблематично.
С py2exe особо глубоко не разбирался - прочитал статью здесь, сделал как в ней написано и сдал работу :)
А вот теперь думаю: py2exe формирует архив librari.zip.
Что если бы формировать не архив, а простой каталог ? Может ли py2exe позволить это ?
Тогда можно было бы все необходимые модули в отдельный пакет, который py2exe туда будет запихивать,
а при обновлении - обновлять именно файлы в этом каталоге ?



Офлайн

#9 Сен. 3, 2007 14:19:03

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Обновление программы по сети

можно сделать и не в library.zip.
Обновление через egg - интересная мысль.
Системы контроля версий избыточны. Объем на диске как минимум в два раза больше, чем без них.
Есть еще одна интересная проблема. Либо код, осуществляющий обновления, сам лежит в необновляемой части и работает до первого импорта обновляемого куска - либо нужно скопировать обновитель куда-нибудь, погасить программу, обновить файлы, запустить ее снова. reload модулей работает нестабильно, а еще есть опасность попасть на блокировку файла.

По моему, готовых универсальных решений не существует, но вполне можно написать свой частный случай (и я такое делал).



Офлайн

#10 Сен. 3, 2007 14:57:55

astoon
От:
Зарегистрирован: 2007-04-09
Сообщения: 335
Репутация: +  2  -
Профиль   Отправить e-mail  

Обновление программы по сети

Андрей Светлов
Есть еще одна интересная проблема. Либо код, осуществляющий обновления, сам лежит в необновляемой части и работает до первого импорта обновляемого куска - либо нужно скопировать обновитель куда-нибудь, погасить программу, обновить файлы, запустить ее снова. reload модулей работает нестабильно, а еще есть опасность попасть на блокировку файла.
Основная идея - добавлять новые модули. Они же и должны изменяться/обновляться.
У программы есть постоянная часть, внешне такая же, как и сейчас. Соответственно в главном, постоянном фрейме можно изначально сделать кнопку “Другие модули”.
Событие “Другие модули” вызывает уже изменяющийся модуль с фреймом, кнопки которого зависят от наличия, скажем, каталогов с модулями, и их вызывают.
Допустим, исключаем блокировки файлов. Что бы не делать reload, в логике кода задаем импорт модулей по условию.
Тогда во время запуска приложения динамические модули уж точно не импортируются.
Остается одно:
Андрей Светлов
можно сделать и не в library.zip.
как ?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version