Загрузка / перезагрузка части кода в Python без перезапуска основного скрипта - PullRequest
5 голосов
/ 27 октября 2011

Intro

Я возился с Twisted последние несколько дней, подцепив питона меньше месяца назад.Моим первым желанием было играть с чем-то, что я знаю и использую каждый день, IRC.Я получил базовое IRC-соединение и работает благодаря примеру ircLogBot.py .

Вопрос

Я хочу иметь произвольный код, который запускается всякий раз, когда IRCсобытие (PRIVMSG / CTCP / JOIN / PART) получено, и в целях отладки я хотел бы иметь возможность вносить изменения в этот фрагмент кода, а затем перезагружать его, не закрывая весь сценарий и повторно подключаясь к серверу IRC.

Заключительные замечания

Это не должно быть решение, включающее Twisted, поскольку я еще не до конца его понимаю.Хотя я полагаю, что именно такие вещи, как twisted, как управляемая событиями среда, скорее всего, предназначены для того, чтобы преуспевать.

Ответы [ 4 ]

9 голосов
/ 28 октября 2011

Twisted имеет некоторые встроенные функции в twisted.python.rebuild, что обеспечивает более полную реализацию встроенной функции Python reload. Есть все еще некоторые ограничения, но его главное отличие от встроенной перезагрузки Python состоит в том, что он найдет старые экземпляры объектов и заменит их классы новой версией. (Основное ограничение заключается в том, что вы должны знать, что ваши экземпляры могут иметь старое состояние, которое не соответствует вашей текущей версии __init__, если вы ее изменили, то есть rebuild.Sensitive для.)

Если вы хотите сделать что-то по-настоящему красивое и автоматическое, вы можете настроить монитор файловой системы, который будет определять, когда файлы изменяются, и повторно загружать связанные модули с перестройкой, когда она изменяется. В Linux вы можете использовать поддержку Twisted inotify для уведомлений об изменениях, а в OS X вы можете использовать cfreactor вместе с FSEvents API через PyObjC . (Я не знаю, какие схемы мониторинга изменений файлов работают на win32, но там это тоже возможно.)

3 голосов
/ 27 октября 2011

Запланируйте повторяющееся событие (каждые несколько секунд), чтобы перезагрузить отлаживаемый модуль.Для этой цели используйте встроенную функцию reload () .

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

2 голосов
/ 27 октября 2011

Возможно, вы захотите взглянуть на ' livecoding ', который выполняет перезагрузку кода;это может удовлетворить ваши потребности.Обратите внимание, что для «живого кодирования» нужны файлы (папки) кода, соответствующие собственным соглашениям, которые не обязательно являются пифоническими.

Другая возможность состоит в том, чтобы развернуть свою собственную систему с использованием reload, как предложил Рэймонд.Если ваш код хорошо отделен от данных о состоянии, его легко реализовать.

0 голосов
/ 27 октября 2011

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

Я иногда запускал весь корпоративный сервер в интерактивном режиме.

...