[python] автообновление кода
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 18.07.14 12:41
Оценка:
Необходимо каким-то образом организовать обновление приложения написанного на Python без его перезапуска. Загрузить, а потом перезапустить приложение – довольно плохой вариант, хотелось бы все проделать на лету.

Я не уверен, но может можно ли заменить, к примеру, часть приложения? Т.е. основная часть приложения обновит свои вспомогательные компоненты на лету и продолжит работать?
Re: [python] автообновление кода
От: visual_wind  
Дата: 18.07.14 12:53
Оценка: 21 (1)
Здравствуйте, kaa.python, Вы писали:

KP>Необходимо каким-то образом организовать обновление приложения написанного на Python без его перезапуска. Загрузить, а потом перезапустить приложение – довольно плохой вариант, хотелось бы все проделать на лету.


KP>Я не уверен, но может можно ли заменить, к примеру, часть приложения? Т.е. основная часть приложения обновит свои вспомогательные компоненты на лету и продолжит работать?


reload?
Re[2]: [python] автообновление кода
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 18.07.14 13:01
Оценка:
Здравствуйте, visual_wind, Вы писали:

_>reload?


Выглядит подходяще!
Re: [python] автообновление кода
От: jazzer Россия Skype: enerjazzer
Дата: 21.07.14 11:05
Оценка: 21 (1)
Здравствуйте, kaa.python, Вы писали:

KP>Необходимо каким-то образом организовать обновление приложения написанного на Python без его перезапуска. Загрузить, а потом перезапустить приложение – довольно плохой вариант, хотелось бы все проделать на лету.


KP>Я не уверен, но может можно ли заменить, к примеру, часть приложения? Т.е. основная часть приложения обновит свои вспомогательные компоненты на лету и продолжит работать?


Помимо reload, есть еще imp.load_source/load_module и прочая — я их юзаю. В отличие от reload, который хочет, чтоб модуль был уже импортирован, load_source это не требуется — он загружает либо перезагружает, независимо от того, был модуль уже загружен или нет.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: [python] автообновление кода
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 21.07.14 11:44
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Помимо reload, есть еще imp.load_source/load_module и прочая — я их юзаю. В отличие от reload, который хочет, чтоб модуль был уже импортирован, load_source это не требуется — он загружает либо перезагружает, независимо от того, был модуль уже загружен или нет.


О, где ж ты был в пятницу Спасибо, если будут проблемы с reload – попробую.
Re[3]: [python] автообновление кода
От: jazzer Россия Skype: enerjazzer
Дата: 21.07.14 11:51
Оценка: 7 (1)
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, jazzer, Вы писали:


J>>Помимо reload, есть еще imp.load_source/load_module и прочая — я их юзаю. В отличие от reload, который хочет, чтоб модуль был уже импортирован, load_source это не требуется — он загружает либо перезагружает, независимо от того, был модуль уже загружен или нет.


KP>О, где ж ты был в пятницу Спасибо, если будут проблемы с reload – попробую.


т.е. чтоб гарантированно все сработало c reload, тебе надо писать
import module
reload(module)

а с imp этого не нужно делать.

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

Наш Выбор (tm)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: [python] автообновление кода
От: monax  
Дата: 24.07.14 06:58
Оценка: 14 (1)
Здравствуйте, kaa.python, Вы писали:

KP>Необходимо каким-то образом организовать обновление приложения написанного на Python без его перезапуска. Загрузить, а потом перезапустить приложение – довольно плохой вариант, хотелось бы все проделать на лету.



На лету это будет происходить или нет — всё равно это перезапуск, что важно понимать. reload, import, etc — это всё форма выполнения модуля.


KP>Я не уверен, но может можно ли заменить, к примеру, часть приложения? Т.е. основная часть приложения обновит свои вспомогательные компоненты на лету и продолжит работать?


Помимо предложенных reload и imp.load_module есть ещё способы. Способы вытекают как раз из того факта, что в питоне import — это выполнение. Я как-то делал загрузку модулей при помощи exec, что позволяет запускать на выполнение с кастомными locals и globals. Поскольку нюансов твоей задачи я не знаю, то первый кандидат — это самый простой imp.load_module, потому что он часть работы делает за тебя. А если нужна система с проверкой синтаксиса загружаемых файлов, возможностью отката к предыдущей рабочей версии, то я бы сделал приложение-координатор, в котором выполнял бы прикладной код внутри кастомных locals, globals. Т.е. пришло обновление — создал новое окружение, вычитал новые файлы, выполнил exec, проверил, что всё работает, выгрузил предыдущее окружение. Если при загрузке нового вылезла ошибка, то обработка ошибки и, возможно, откат к предыдущей версии.

Кстати, версия питона какая (к вопросу вряд ли имеет отношение, но интересно)?
Re[2]: [python] автообновление кода
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 24.07.14 07:05
Оценка:
Здравствуйте, monax, Вы писали:

M>На лету это будет происходить или нет — всё равно это перезапуск, что важно понимать. reload, import, etc — это всё форма выполнения модуля.


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

M>Кстати, версия питона какая (к вопросу вряд ли имеет отношение, но интересно)?



2.7, мне Twisted нужен был
Re: [python] автообновление кода
От: targeted Россия http://www.targeted.org/
Дата: 22.05.15 09:05
Оценка:
KP>Необходимо каким-то образом организовать обновление приложения написанного на Python без его перезапуска.

А вот тут весь фрэймворк такой, с перезагрузкой модулей на лету:

http://pythomnic3k.org/tour-dynamic.html
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.