Заставить __import__ получить динамически добавленные методы - PullRequest
1 голос
/ 31 августа 2010

На моем рабочем месте есть скрипт (разновидность системы автоматизации), который загружает и запускает наши тесты приложений из файла XML.

В середине процесса скрипт вызывает __import__(testModule), который загружаетмодуль из его файла.

Проблема начинается, когда я пытался добавить функцию, динамически добавляя функции к testModule во время выполнения.

Как и ожидалось, __import__ получает старую версию модуля, в которой нет методов, которые я только что добавил во время выполнения.

Возможно ли выполнить импорт вызовов __import__более новая версия класса (которая включает методы, которые я добавил)?

Обратите внимание, что я предпочитаю не трогать систему автоматизации (даже если это поможет быстрее решить проблему).

Спасибо

Тал.

Ответы [ 2 ]

2 голосов
/ 31 августа 2010

Вы должны знать, что перезагрузка модуля магическим образом не заменит старые экземпляры.Даже если вы сделаете reload, только новые объекты будут использовать новый код!

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

Быстрая демонстрация:

>>> import asd
>>> asd.s
'old'
>>> t = asd.s
>>> reload(asd) # I edited asd.py before
<module 'asd' from 'asd.py'>
>>> asd.s # new module content
'new'
>>> t # but this is still old!
'old'

Большинство приложений, которые похожи на этоперезагружает код на самом деле просто перезагрузите!

1 голос
/ 31 августа 2010
reload(testmodule)

может работать.

...