Динамическая подгрузка модулей

Допустим, существует такая цепочка:

  1. подгружаем модуль через imp.load_*()
  2. наследуем определённому в нём классу
  3. перезагружаем модуль через imp.load_*()
  4. вызываем из потомка метод класса-предка

Случится ошибка:

*** Error report begin ***
error command: >bridge 0<
<bound method bridge._init of <xshell.configure.network.interfaces.bridge.bridge object at 0xb798266c>>
failed: unbound method init() must be called with template instance as first argument (got bridge instance instead)
----
Traceback (most recent call last):
  File "/var/lib/home/peet/Projects/radlinux/shell/branches/0.4.4_new_state/state/core.py", line 183, in call
    result = method(pack)
  File "/var/lib/home/peet/Projects/radlinux/shell/branches/0.4.4_new_state/command.py", line 214, in _init
    r = self.init(opts)
  File "/home/peet/Projects/radlinux/modules/branches/main/configure/network/interfaces/bridge.py", line 58, in init
    result = template.init(self,opts)
TypeError: unbound method init() must be called with template instance as first argument (got bridge instance instead)
----

Связано это с тем, что модуль нельзя загружать несколько раз.

Заметка от Ивана Фёдорова: [18:48:45] <Иван Фёдоров> reload надо делать

Заметка из доков: If the module was already initialized, it will be initialized again.

Поможет ли reload, непонятно, но лучше избегать множественной загрузки.

Префиксы пространств имён

Допустим, есть код:

xModule = imp.load_source("esoteric.module","path/to/code.py")

всё, что он заимпортит, будет так:

esoteric.sys
esoteric.os
esoteric.command.command 

и т.п. Если же сделать:

xModule = imp.load_source("esoteric","no/matter/what.py")
xModule = imp.load_source("esoteric.module","path/to/code.py")

то всё будет пучком. От __init__.py не зависит никак.

Т.е. нельзя импортировать модуль с id через точку, если в словаре нет модулей более ранних по пути (в смысле точек, не фс)

выводы

Ничего страшного, но исключения, запущенные во втором случае, не могут быть корректно обработаны в ядре. При этом основная функциональность сохранится: модуль будет работать. Подробнее -- [677]