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

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

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

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

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

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

Благодарность

Таль .

1
Tal 31 Авг 2010 в 02:09

2 ответа

Лучший ответ

Вы должны знать, что перезагрузка модуля волшебным образом не заменит старые экземпляры. Даже если вы сделаете 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'

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

2
Jochen Ritzel 30 Авг 2010 в 22:56
reload(testmodule)

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

1
Ivo van der Wijk 30 Авг 2010 в 22:13