Форум сайта python.su
Привет всем.
Есть приложение на 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))
Офлайн
Я так понимаю этот кусок импортирует некие модули в некотором каталоге и засовывает их в список. Посмотрите на модуль imp функции load_source или load_module.
Офлайн
Alex2ndrСпасибо за ответ, почитаю про этим функции. Вопрос еще конечно в том, придется ли передалывать сами загружаемые модули, если использовать что-то вместо __import__.
Я так понимаю этот кусок импортирует некие модули в некотором каталоге и засовывает их в список. Посмотрите на модуль imp функции load_source или load_module.
Офлайн
Кажется понял в чем проблема. Посмотрев еще раз на текст ошибки и почитав хелп по __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)
Офлайн
Андрей Светлов, спасибо! Код работоспобен (только в джойне скобки квадратные поставил), по чтению мануалов пришел к такому же почти коду, но все равно что то не срабатывало. Продвинулся дальше, но там еще есть импорты в других местах разбираюсь с ними.
Офлайн
Теперь ошибка в другом месте, но тоже свяна с плагинами и импортом.
Есть вот такой код (это оригинальный код, у меня в строке 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'"
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)
Офлайн
Кажется разобрался почему не работает (почитал хелп по __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)
Офлайн