Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 10, 2010 10:40:32

AlexAV
От:
Зарегистрирован: 2010-08-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Плагины и __import__

Привет всем.
Есть приложение на Python - http://code.google.com/p/gloss-mc/. Это клиент (фронтэнд) для MythTV, хотя наверное это мало кому что скажет. Суть проблемы с которой я столкнулся это то что при запуске этого приложения происходит ошибка “ImportError: Import by filename is not supported.” Я так понимаю что в версии 2.6 теперь использовать __import__, как он использован в рассматриваемом приложении, нельзя. Пробовал запустить с Python 2.5, но тогда уже проблемы с тем, что используемые приложением библиотеки в Ubuntu 9.10 хотят версию не менее 2.6. Можно конечно запустить со старым Python и библиотеками, но смысл как раз в том, чтобы запустить это дело с более актуальными на сегодняшний день версиями библиотек и Python.
Вот кусок кода где импортируются плагины

modules = []
def find_modules():
#Import all the modules
mod_dir = "modules"
module_list = os.listdir(mod_dir)

for fs_object in module_list:
path = mod_dir + "/" + fs_object
if os.path.isdir(path) and (not fs_object[0] == "."):
tmp_dir = mod_dir+"/"+fs_object+"/"+fs_object
#Only print the module if its not the tests one
if not fs_object == "tests": print "Found Module: " + fs_object
modules.append(__import__(tmp_dir))
Пробовал поиск по форуму, в принципе понял что можно использовать и другие способы кроме __import__. Если не сложно подскажите как поменять этот код или пните в нужном направлении куда копать.



Офлайн

#2 Авг. 10, 2010 11:38:57

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Плагины и __import__

Я так понимаю этот кусок импортирует некие модули в некотором каталоге и засовывает их в список. Посмотрите на модуль imp функции load_source или load_module.



Офлайн

#3 Авг. 10, 2010 13:47:05

AlexAV
От:
Зарегистрирован: 2010-08-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Плагины и __import__

Alex2ndr
Я так понимаю этот кусок импортирует некие модули в некотором каталоге и засовывает их в список. Посмотрите на модуль imp функции load_source или load_module.
Спасибо за ответ, почитаю про этим функции. Вопрос еще конечно в том, придется ли передалывать сами загружаемые модули, если использовать что-то вместо __import__.



Офлайн

#4 Авг. 10, 2010 14:32:43

AlexAV
От:
Зарегистрирован: 2010-08-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Плагины и __import__

Кажется понял в чем проблема. Посмотрев еще раз на текст ошибки и почитав хелп по __import__, а также посмотрев статьи и обсуждения по поводу плагинов через __import__ (спасибо за них) вроде сообразил в чем проблема. В приведенном мной коде путь к плагинам указывается как обычный путь к каталогам, с использованием символа “/”, а теперь я так понял нужно для __import__ указывать через “.”.



Офлайн

#5 Авг. 10, 2010 18:57:27

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

Плагины и __import__

Этого будет мало. Если уж полезли править исходники - делайте так:
1. Добавьте в каждую папку внутри modules файл __init__.py, если такого нет. Пустой.
2. Поменяйте код загрузки

modules = []
def find_modules():
#Import all the modules
mod_dir = "modules"
module_list = os.listdir(mod_dir)

for fs_object in module_list:
path = mod_dir + "/" + fs_object
if os.path.isdir(path) and (not fs_object[0] == "."):
mod_name = '.'.join(mod_dir, fs_object, fs_object)
#Only print the module if its not the tests one
if not fs_object == "tests": print "Found Module: " + fs_object
root = __import__(mod_name)
plug_package = getattr(root, fs_object)
plug_module = getattr(plug_package, fs_object)
modules.append(plug_module)
Кажется, это более соответствует ожидаемому поведению. Работоспособность не проверял.



Офлайн

#6 Авг. 10, 2010 21:49:05

AlexAV
От:
Зарегистрирован: 2010-08-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Плагины и __import__

Андрей Светлов, спасибо! Код работоспобен (только в джойне скобки квадратные поставил), по чтению мануалов пришел к такому же почти коду, но все равно что то не срабатывало. Продвинулся дальше, но там еще есть импорты в других местах разбираюсь с ними.



Офлайн

#7 Авг. 12, 2010 13:52:56

AlexAV
От:
Зарегистрирован: 2010-08-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Плагины и __import__

Теперь ошибка в другом месте, но тоже свяна с плагинами и импортом.
Есть вот такой код (это оригинальный код, у меня в строке interface_path слеши заменены на точки)

    def set_menu_transition(self, transition_name):
#Setup the menu transition
transition_path = "transitions/menus/" + transition_name
self.transition = __import__(transition_path).Transition(self)
При его выполнении выдается ошибка
unhandled AttributeError
"'module' object has no attribute 'slide'"
Модуль slide, который импортируется, выглядит следующим образом
import clutter

class Transition:

def __init__(self, GlossMgr):
self.stage = GlossMgr.stage
self.glossMgr = GlossMgr

def do_transition(self, fromMenu, toMenu):

#oldGroup = fromMenu.getItemGroup()
#newGroup = toMenu.getItemGroup()

#oldGroup.set_opacity(255)

self.timeline = clutter.Timeline(25, 50)
self.timeline.connect('completed', self.slide_complete, fromMenu)

#и т.д.



Отредактировано (Авг. 12, 2010 13:54:17)

Офлайн

#8 Авг. 12, 2010 15:17:38

AlexAV
От:
Зарегистрирован: 2010-08-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Плагины и __import__

Кажется разобрался почему не работает (почитал хелп по __import__). Импортом мы как-то импортируем некую иерархию (сорри не могу выразится в правильных терминах), чтобы добраться до того что нам нужно, код должен быть следующим:

        transition_path = "transitions.menus." + transition_name
package_obj = __import__(transition_path)
print dir (package_obj)
module_obj = getattr (package_obj, "menus")
print dir (module_obj)
obj = getattr (module_obj, transition_name)
print dir (obj)
self.transition = obj.Transition(self)
print'ы ессно не нужны, это для наглядности.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version