2010-05-24 6 views
2

сценарий: модульное приложение, которое загружает модули .py на лету, когда оно работает. программист (я) хочет отредактировать код модуля, а затем повторно загрузить его в программу без остановки выполнения.как отредактировать запущенную программу python?

это можно сделать?

я попытался запустить импортировать второй раз на обновленный module.py, но изменения не взяли

ответ

6

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

Если вы когда-либо использовать форму from module import afunction, то вы почти обеспечили reload не будет работать: вы должны исключительно импорт модулей никогда функции, классы и т.д., из внутренних модулей, если вы хотите иметь любая надежда reload делать что-то полезное все (в противном случае вам придется каким-то образом преследовать все кусочки и кусочки, импортированные здесь и там из модуля, и перепроверять каждый из них - eep ;-). Обратите внимание, что я предпочитаю следовать этому правилу в любом случае, планирую ли я перезагружать или нет, но при перезагрузке это решающее значение.

Сложная проблема: если у вас есть живые в любом месте экземпляры классов, существовавшие в предыдущей версии модуля, то reload сам по себе ничего не сделает для обновления этих экземпляров. То, что проблема действительно тяжелая; один из самых длинных, самых сложных рецептов в Cookbook Python (2-е издание) - все о том, как закодировать свои модули для поддержки такой «перезагрузки, которая фактически обновляет существующие экземпляры». Это имеет значение только в том случае, если вы программируете в стиле ООП, конечно, но ... любой программный комплекс Python, достаточный для того, чтобы обладать функциональностью «перезагрузить этот плагин», - очень, вероятно, в нем много ООП, так что это едва ли второстепенная проблема.

docs for reload довольно полные и упоминают эту проблему, но не дают никаких подсказок, как ее решить. This recipe Майкл Хадсон из Python Cookbook онлайн, это лучше, но это только начало того, что мы превратили в печатное (2-е издание) - рецепт 20.15, онлайн-версия которого - here (неполная, если вы не подписаны на бесплатное ограниченное время просмотра коммерческого онлайн-сервиса O'Reilly's).

+0

Возможно, возможно реализовать ограниченную «перезагрузку» только для модулей, которые OP заинтересован в использовании некоторых API-интерфейсов доморощенного. –

0

reload() будет делать то, что вам нужно. Вам просто нужно быть осторожным в том, какой код выполняется в вашем модуле после повторной компиляции; это обычно проще всего, если ваш модуль содержит только определения.

0

Ответ Алекса и остальные охватывают общий случай.

Однако, поскольку эти модули, над которыми вы работаете, являются вашими собственными, и вы будете редактировать только их, возможно реализовать какой-то локальный механизм перезагрузки, а не полагаться на встроенную перезагрузку.Вы можете архивировать загрузчик вашего модуля как что-то, что загружает файлы, компилирует его и анализирует их в определенное пространство имен и сообщает вызывающему коду, что он готов. Вы можете позаботиться о перезагрузке, убедившись, что есть достойная функция init, которая правильно инициализирует модуль. Я предполагаю, что вы будете редактировать только эти.

Это немного работа, но может быть интересно и стоит вашего времени.

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