Форум сайта python.su
Здравствуйте! Есть вот такой код
для работы с плагинами
import wx
import glob
import sys
class ModulesDialog(wx.Dialog):
def __init__(self,parent,id=-1,plist=): #plist содержит список путей для поиска
wx.Dialog.__init__(self,parent,id,“”)
bx=wx.BoxSizer(wx.VERTICAL)
bxH=wx.BoxSizer(wx.HORIZONTAL)
self.beginBtn=wx.Button(self,-1,“”)
self.infoBtn=wx.Button(self,-1,“”)
self.lb=wx.ListBox(self,-1,size=(300,300))
bxH.Add(self.beginBtn,0,0)
bxH.Add(self.infoBtn,0,0)
bx.Add(bxH,0,0)
bx.Add(self.lb,0,0)
self.SetSizer(bx)
self.Fit()
self.mlist= #СПИСОК ЗАГРУЖЕННЫХ МОДУЛЕЙ
print “PLIST=”,plist
for i in plist:
if i=='':
continue
self.loadFromPath(i)
for i in self.mlist:
self.lb.Append(self.getModuleInfo(i))
def loadFromPath(self,path):
npath=path
if path!='/':
npath+='/'
npath+=“*.py”
flist=glob.glob(npath)
if len(flist)==0:
return
print “NPATH=”,npath
print “FLIST=”,flist
module=None
for i in flist:
name=i # убираем расширение
print “Name=”,name
module=__import__(name)
print module
self.mlist.append(module)
def getModuleInfo(self,md):
return md.Method.getName()
при запуске из основной программы вылетает с исключением
Traceback (most recent call last):
File “./main.py”, line 465, in OnModules
dlg=Modules.ModulesDialog(self,id=-1,plist=self.options.split(':'))
File “/home/ser/develop/pqfp2/Modules.py”, line 34, in __init__
self.loadFromPath(i)
File “/home/ser/develop/pqfp2/Modules.py”, line 61, in loadFromPath
module=__import__(name)
ImportError: No module named /home/ser/develop/pqfp2/modules/Example
Но если в интерактивно режиме записать все работает нормально.
>>> __import__(“/home/ser/develop/pqfp2/modules/Example”)
<module ‘/home/ser/develop/pqfp2/modules/Example’ from ‘/home/ser/develop/pqfp2/modules/Example.pyc’>
Мож кто знает в чем косяк
Офлайн
Я обычно использую полную форму вызова функции __import__:
m = __import__(modname, globals(), locals())
там есть еще 4й аргумент, иногда он полезен.
А ‘/home/ser/develop/pqfp2/modules/’ – это пакет?
Впрочем в Питоне 2.5 добавлять в каталоги __init__.py стало не обязательно, чтобы сделать пакет
Офлайн
А вы могли бы показать всю отладочную печать вашего скрипта (у вас там ее багацько).
И из какого каталога стартует скрипт?
Офлайн
'/home/ser/develop/pqfp2/modules/' - нет это просто каталог
Вся отладочная инфа:
PLIST=
NPATH= /home/ser/develop/pqfp2/modules/*.py
FLIST=
Name= /home/ser/develop/pqfp2/modules/Example
Traceback (most recent call last):
File “./main.py”, line 466, in OnModules
dlg=Modules.ModulesDialog(self,id=-1,plist=self.options.split(':'))
File “/home/ser/develop/pqfp2/Modules.py”, line 34, in __init__
self.loadFromPath(i)
File “/home/ser/develop/pqfp2/Modules.py”, line 61, in loadFromPath
module=__import__(name)
ImportError: No module named /home/ser/develop/pqfp2/modules/Example
Скрипт стартует из /home/ser/develop/pqfp2/main.py
Весь прикол в том, что код
>> __import__(“/home/ser/develop/pqfp2/modules/Example”)
из интерактивного режима работает норамально.
А в чём косяк понать не могу :(
Офлайн
>> m = __import__(modname, globals(), locals())
>> там есть еще 4й аргумент, иногда он полезен.
Я в курсе, но тоже не работает
Офлайн
вобщето говоря весь прикол в том, что первый аргумент в __import__ должен содержать не путь со слешами, а питоновское имя модуля с точками, т.е. типа ‘modules.Example’. А вот почему оно работает в интерактивном режиме – для меня загадка
Офлайн