Найти - Пользователи
Полная версия: Python 3.2: Динамический импорт
Начало » Python для новичков » Python 3.2: Динамический импорт
1 2
ValeriyB
Уже голову сломал, перекопал статьи, так ничего и не вышло.

Посоветуйте, как динамически подгружать плагины которые лежат в папке plugins/CATEGORY/PLUGIN_FOLDER/myplugin1.py
Где имена CATEGORY, PLUGIN_FOLDER, myplugin1.py - неизвестны.

Имя класса заведомо известно.

doza_and
:) не видно результатов ломания головы. Вы это пробовали?
http://docs.python.org/py3k/library/functions.html#__import__
cutwater
doza_and, тогда уже лучше http://docs.python.org/py3k/library/importlib.html#importlib.import_module
iBiZoNiX
def foo():
   x = 10
a = __import__('plugins/CATEGORY/PLUGIN_FOLDER/myplugin1.py')
ValeriyB
С функциями то все ясно, непонятно только как искать модули. Через os.listdir?
Андрей Светлов

iBiZoNiX, ваш способ работал на старых питонах из-за ошибки в import.c Баг убрали, в import нельзя передавать путь к файлу.

ValeriyB
Динамический импорт удался используя importlib.import_module.
Только осталась небольшой задача…

for module_path in module_list:
     self.module = import_module(module)
def delcareClass(self, class_name)
      self.myclass = self.module.class_name()

В модулях есть классы с разными названиями(TestClass1, и тд). Как можно организовать чтобы функция self.delcareClass(“TestClass2”) преобразовывала строку “TestClass2” в имя класса TestClass2?
reclosedev
ValeriyB
В модулях есть классы с разными названиями(TestClass1, и тд). Как можно организовать чтобы функция self.delcareClass(“TestClass2”) преобразовывала строку “TestClass2” в имя класса TestClass2?
Можно с помощью встроенной функции getattr()
self.myclass = getattr(self.module, class_name)()
ValeriyB
Спасибо, этот вариант сработал!

Только заметил что переменная self.module хранит в себе только последний загруженный модуль.

for module_path in module_list:
     self.module = import_module(module)

Может я неправильно присвоил импорт переменной?
iBiZoNiX
Андрей Светлов, я пользуюсь Python 3.2 и динамический импорт делаю через функцию __import__() с передачей пути в качестве аргумента.
Допустим есть папка plugins в папке с программой.Нам нужно выполнить один метод каждого плагина.
import os,sys
plugins = os.listdir('./plugins')
meth = 'test'
sys.path.insert( 0, 'plugins')
for plugin in plugins:
    mod = __import__(plugin)
    if hasattr(mod, meth):
        attr = getattr(mod, meth)
        attr()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB