Форум сайта python.su
Доброго времени суток.
Возник достаточно неожиданный баг.
В программе используется GUI Tkinter, в отдельном потоке пытаюсь запустить urllib.urlopen, который не выполняется, и вылезает:
Fatal Python error: PyImport_GetModuleDict: no module dictionary!
после закрытия окна программы.
Повторить этот баг в более меньшем объеме кода не получается, но ситуация очень похожа на это:
http://bugs.python.org/issue1720705 (самое интересное, что этот баг у меня вопсроизводится не всегда (!), то есть то есть то нет.)
Как можно попытаться решить проблему?
P.S. python 2.6.5 на windows xp
P.P.S. Код, в котором в потоке запускается urlopen, импортируется через __import__, если это важно.
P.P.S. В linux мой код вываливается с ImportError: No module named httplib
Отредактировано (Апрель 21, 2010 16:44:20)
Офлайн
Вроде что то похожее:
имеем файл test.py и папку mod
import sys
sys.path.append('mod')
import main
from Tkinter import *
root=Tk()
sys.path.append('mod')
obj=__import__('ext')
cl=getattr (obj, 'Plugin')()
root.mainloop()
import thread
import urllib
import time
class Plugin:
def __init__(self):
thread.start_new_thread(self.run,())
def run(self):
while 1:
time.sleep(1)
self.sync()
def sync(self):
resp=urllib.urlopen('http://ya.ru')
print 'ok'
Unhandled exception in thread started by
Traceback (most recent call last):
File "mod\ext.py", line 12, in run
self.sync()
File "mod\ext.py", line 14, in sync
resp=urllib.urlopen('http://ya.ru')
File "c:\python26\lib\urllib.py", line 86, in urlopen
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
Отредактировано (Апрель 21, 2010 19:41:10)
Офлайн
lorienхм…. при использовании его, у меня еще более странные вещи начинают твориться: в бесконечном цикле запускаются все новые и новые копии приложения а не функция, указанная в target.
, попробуйте для выполнения параллельных задач использовать mulitprocessing
lorienТкните пожалуйста носом :)
там даются рекомендации как избежать ошибки
Отредактировано (Апрель 22, 2010 14:18:58)
Офлайн
Не помогает….
Почитал так же, что все импорты должны быть завершены до создания потока. Получается, у меня import main до конца еще не выполнен, и я создаю поток. Отсюда все проблемы. Пробовал создавать поток асинхронно, через пару секунд, чтоб import main был завершен…. Хотя… Блин, он же так и не будет завершен, так как в main.py запускается mainloop().
Придется все же в test.py (запускалку) вынести часть кода
upd: Так и сделал, все заработало! lorien спасибо за наводку!
Отредактировано (Апрель 22, 2010 15:17:14)
Офлайн