Необходимо каким-то образом организовать обновление приложения написанного на Python без его перезапуска. Загрузить, а потом перезапустить приложение – довольно плохой вариант, хотелось бы все проделать на лету.
Я не уверен, но может можно ли заменить, к примеру, часть приложения? Т.е. основная часть приложения обновит свои вспомогательные компоненты на лету и продолжит работать?
Здравствуйте, kaa.python, Вы писали:
KP>Необходимо каким-то образом организовать обновление приложения написанного на Python без его перезапуска. Загрузить, а потом перезапустить приложение – довольно плохой вариант, хотелось бы все проделать на лету.
KP>Я не уверен, но может можно ли заменить, к примеру, часть приложения? Т.е. основная часть приложения обновит свои вспомогательные компоненты на лету и продолжит работать?
Здравствуйте, kaa.python, Вы писали:
KP>Необходимо каким-то образом организовать обновление приложения написанного на Python без его перезапуска. Загрузить, а потом перезапустить приложение – довольно плохой вариант, хотелось бы все проделать на лету.
KP>Я не уверен, но может можно ли заменить, к примеру, часть приложения? Т.е. основная часть приложения обновит свои вспомогательные компоненты на лету и продолжит работать?
Помимо reload, есть еще imp.load_source/load_module и прочая — я их юзаю. В отличие от reload, который хочет, чтоб модуль был уже импортирован, load_source это не требуется — он загружает либо перезагружает, независимо от того, был модуль уже загружен или нет.
Здравствуйте, jazzer, Вы писали:
J>Помимо reload, есть еще imp.load_source/load_module и прочая — я их юзаю. В отличие от reload, который хочет, чтоб модуль был уже импортирован, load_source это не требуется — он загружает либо перезагружает, независимо от того, был модуль уже загружен или нет.
О, где ж ты был в пятницу Спасибо, если будут проблемы с reload – попробую.
Здравствуйте, kaa.python, Вы писали:
KP>Здравствуйте, jazzer, Вы писали:
J>>Помимо reload, есть еще imp.load_source/load_module и прочая — я их юзаю. В отличие от reload, который хочет, чтоб модуль был уже импортирован, load_source это не требуется — он загружает либо перезагружает, независимо от того, был модуль уже загружен или нет.
KP>О, где ж ты был в пятницу Спасибо, если будут проблемы с reload – попробую.
т.е. чтоб гарантированно все сработало c reload, тебе надо писать
import module
reload(module)
а с imp этого не нужно делать.
Плюс (для меня) imp-у можно давать просто полный путь к модулю (т.е. его может и не быть в путях для автоматического поиска (и это круто), и сам модуль загружать под разными именами (или вообще без имен, просто в список их сложить — если у тебя несколько директорий, в каждой питоновский файл с одинаковым именем лежит).
Здравствуйте, kaa.python, Вы писали:
KP>Необходимо каким-то образом организовать обновление приложения написанного на Python без его перезапуска. Загрузить, а потом перезапустить приложение – довольно плохой вариант, хотелось бы все проделать на лету.
На лету это будет происходить или нет — всё равно это перезапуск, что важно понимать. reload, import, etc — это всё форма выполнения модуля.
KP>Я не уверен, но может можно ли заменить, к примеру, часть приложения? Т.е. основная часть приложения обновит свои вспомогательные компоненты на лету и продолжит работать?
Помимо предложенных reload и imp.load_module есть ещё способы. Способы вытекают как раз из того факта, что в питоне import — это выполнение. Я как-то делал загрузку модулей при помощи exec, что позволяет запускать на выполнение с кастомными locals и globals. Поскольку нюансов твоей задачи я не знаю, то первый кандидат — это самый простой imp.load_module, потому что он часть работы делает за тебя. А если нужна система с проверкой синтаксиса загружаемых файлов, возможностью отката к предыдущей рабочей версии, то я бы сделал приложение-координатор, в котором выполнял бы прикладной код внутри кастомных locals, globals. Т.е. пришло обновление — создал новое окружение, вычитал новые файлы, выполнил exec, проверил, что всё работает, выгрузил предыдущее окружение. Если при загрузке нового вылезла ошибка, то обработка ошибки и, возможно, откат к предыдущей версии.
Кстати, версия питона какая (к вопросу вряд ли имеет отношение, но интересно)?
Здравствуйте, monax, Вы писали:
M>На лету это будет происходить или нет — всё равно это перезапуск, что важно понимать. reload, import, etc — это всё форма выполнения модуля.
Ну я в итоге пришел к тому, что мне нужно переписать вообще все файлы, включая обновлялку. Так что я воспользовался штатным launchd для перезагрузки приложения.
M>Кстати, версия питона какая (к вопросу вряд ли имеет отношение, но интересно)?