Найти - Пользователи
Полная версия: Плагины и __import__
Начало » Python для новичков » Плагины и __import__
1
AlexAV
Привет всем.
Есть приложение на 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__. Если не сложно подскажите как поменять этот код или пните в нужном направлении куда копать.
Alex2ndr
Я так понимаю этот кусок импортирует некие модули в некотором каталоге и засовывает их в список. Посмотрите на модуль imp функции load_source или load_module.
AlexAV
Alex2ndr
Я так понимаю этот кусок импортирует некие модули в некотором каталоге и засовывает их в список. Посмотрите на модуль imp функции load_source или load_module.
Спасибо за ответ, почитаю про этим функции. Вопрос еще конечно в том, придется ли передалывать сами загружаемые модули, если использовать что-то вместо __import__.
AlexAV
Кажется понял в чем проблема. Посмотрев еще раз на текст ошибки и почитав хелп по __import__, а также посмотрев статьи и обсуждения по поводу плагинов через __import__ (спасибо за них) вроде сообразил в чем проблема. В приведенном мной коде путь к плагинам указывается как обычный путь к каталогам, с использованием символа “/”, а теперь я так понял нужно для __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)
Кажется, это более соответствует ожидаемому поведению. Работоспособность не проверял.
AlexAV
Андрей Светлов, спасибо! Код работоспобен (только в джойне скобки квадратные поставил), по чтению мануалов пришел к такому же почти коду, но все равно что то не срабатывало. Продвинулся дальше, но там еще есть импорты в других местах разбираюсь с ними.
AlexAV
Теперь ошибка в другом месте, но тоже свяна с плагинами и импортом.
Есть вот такой код (это оригинальный код, у меня в строке 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)

#и т.д.
AlexAV
Кажется разобрался почему не работает (почитал хелп по __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'ы ессно не нужны, это для наглядности.
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