Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 13, 2012 18:12:12

ValeriyB
Зарегистрирован: 2012-04-10
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

Python 3.2: Динамический импорт

Уже голову сломал, перекопал статьи, так ничего и не вышло.

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

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

Офлайн

#2 Апрель 13, 2012 18:51:28

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Python 3.2: Динамический импорт

:) не видно результатов ломания головы. Вы это пробовали?
http://docs.python.org/py3k/library/functions.html#__import__



Офлайн

#3 Апрель 13, 2012 20:37:51

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Python 3.2: Динамический импорт

Офлайн

#4 Апрель 14, 2012 09:45:09

iBiZoNiX
От: Пирятин
Зарегистрирован: 2011-07-05
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 3.2: Динамический импорт

def foo():
   x = 10
a = __import__('plugins/CATEGORY/PLUGIN_FOLDER/myplugin1.py')



Офлайн

#5 Апрель 14, 2012 10:14:32

ValeriyB
Зарегистрирован: 2012-04-10
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

Python 3.2: Динамический импорт

С функциями то все ясно, непонятно только как искать модули. Через os.listdir?

Офлайн

#6 Апрель 14, 2012 12:02:05

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Python 3.2: Динамический импорт

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



Офлайн

#7 Апрель 14, 2012 18:44:14

ValeriyB
Зарегистрирован: 2012-04-10
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

Python 3.2: Динамический импорт

Динамический импорт удался используя 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?

Офлайн

#8 Апрель 14, 2012 19:19:57

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Python 3.2: Динамический импорт

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

Офлайн

#9 Апрель 14, 2012 19:46:30

ValeriyB
Зарегистрирован: 2012-04-10
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

Python 3.2: Динамический импорт

Спасибо, этот вариант сработал!

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

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

Может я неправильно присвоил импорт переменной?

Офлайн

#10 Апрель 14, 2012 20:23:21

iBiZoNiX
От: Пирятин
Зарегистрирован: 2011-07-05
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 3.2: Динамический импорт

Андрей Светлов, я пользуюсь 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()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version