Как мне отредактировать запущенную программу на Python? - PullRequest
2 голосов
/ 24 мая 2010
Сценарий

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

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

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

Ответы [ 5 ]

6 голосов
/ 24 мая 2010

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

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

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

Документы для перезагрузки довольно полны и упоминают эту проблему, но не дают подсказки, как ее решить. Этот рецепт Майкла Хадсона из онлайн-книги Python Cookbook лучше, но это только начало того, что мы превратили в печатное (2-е издание) - рецепт 20.15, онлайн-версия которого здесь (не полностью, если вы не подпишетесь на бесплатный ограниченный по времени предварительный просмотр коммерческого онлайн-сервиса книг О'Рейли).

0 голосов
/ 24 мая 2010

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

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

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

0 голосов
/ 24 мая 2010

Вы можете получить некоторое использование из модуля livecoding .

0 голосов
/ 24 мая 2010

используйте встроенную команду:

reload(module)

Как выгрузить (перезагрузить) модуль Python?

0 голосов
/ 24 мая 2010

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

...