Форум сайта python.su
1
Уже голову сломал, перекопал статьи, так ничего и не вышло.
Посоветуйте, как динамически подгружать плагины которые лежат в папке plugins/CATEGORY/PLUGIN_FOLDER/myplugin1.py
Где имена CATEGORY, PLUGIN_FOLDER, myplugin1.py - неизвестны.
Имя класса заведомо известно.
Офлайн
253
:) не видно результатов ломания головы. Вы это пробовали?
http://docs.python.org/py3k/library/functions.html#__import__
Офлайн
19
doza_and, тогда уже лучше http://docs.python.org/py3k/library/importlib.html#importlib.import_module
Офлайн
0
def foo(): x = 10 a = __import__('plugins/CATEGORY/PLUGIN_FOLDER/myplugin1.py')
Офлайн
1
С функциями то все ясно, непонятно только как искать модули. Через os.listdir?
Офлайн
14
iBiZoNiX, ваш способ работал на старых питонах из-за ошибки в import.c Баг убрали, в import нельзя передавать путь к файлу.
Офлайн
1
Динамический импорт удался используя 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()
Офлайн
173
ValeriyBМожно с помощью встроенной функции getattr()
В модулях есть классы с разными названиями(TestClass1, и тд). Как можно организовать чтобы функция self.delcareClass(“TestClass2”) преобразовывала строку “TestClass2” в имя класса TestClass2?
self.myclass = getattr(self.module, class_name)()
Офлайн
1
Спасибо, этот вариант сработал!
Только заметил что переменная self.module хранит в себе только последний загруженный модуль.
for module_path in module_list: self.module = import_module(module)
Офлайн
0
Андрей Светлов, я пользуюсь 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()
Офлайн