суббота, 21 мая 2011 г.

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

Нужно было реализовать что-то типа плагинов: есть скрипт, представляющий из себя основу, и набор модулей для этой основы, для разных сервисов. То есть появился новый сервис - написал модуль, закинул в папку к скрипту - всё работает. Делается это довольно просто с помощью функции __import__:


module = "common_module" // название файла модуля
dyn_module = __import__(module)
Class = dyn_module.Dyn_Class // Dyn_Class - класс из модуля

4 комментария:

  1. ...и ловим много лулзов, если имя совпадает с другим модулем из stdlib/site-packages/чем-либо-еще-из-sys.path. Для динамических импортов придумали специальный модуль: http://docs.python.org/library/imp.html

    ОтветитьУдалить
  2. Позвольте не согласиться.
    imp придумали скорее для работы с самим механизмом импорта. Например, при реализации своего import hook...
    imp загружает модули, но не делает их регистрации. Прощай, модуль-синглетон!

    __import__ — это именно импорт модуля. Правда, не очень удобный интерфейс. Попробуйте __import__('package.subpackage.module') для примера.
    Удобный — в importlib. В 2.7 появился огрызок от этой библиотеки, содержащий importlib.import_module(name, package=None)

    ОтветитьУдалить
  3. есть решения для этого
    http://jenyay.net/Programming/PyPlugins
    http://habrahabr.ru/blogs/python/79513/

    сейчас переписываю проект, хочу там ввести систему плагинов для расширения. выбрал yapsy для этого
    http://yapsy.sourceforge.net/

    ОтветитьУдалить
  4. Приходи снова общаться на форуме. Я ща сам активно питон изучаю ;) Постоянно есть вопросы

    ОтветитьУдалить