Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 21, 2010 16:15:21

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Fatal Python error

Доброго времени суток.
Возник достаточно неожиданный баг.
В программе используется 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)

Офлайн

#2 Апрель 21, 2010 19:38:08

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Fatal Python error

Вроде что то похожее:
имеем файл test.py и папку mod

import sys
sys.path.append('mod')
import main
в папке mod файл main.py
from Tkinter import *

root=Tk()

sys.path.append('mod')
obj=__import__('ext')
cl=getattr (obj, 'Plugin')()

root.mainloop()
И соотвественно в той же папке ext.py
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:
либо с Fatal Python error: PyImport_GetModuleDict: no module dictionary!

Это повторяет архитектуру моего проекта. Если запускать непосредственно main.py а не test.py, то все работает нормально. Но проект я собираюсь упаковывать с помощью py2exe, и в exe хочу оставить только запускалку, чтоб сам main.py можно было обновлять через систему обновлений программы. Как выкрутиться? И вообще, откуда такая ошибка возникает?



Отредактировано (Апрель 21, 2010 19:41:10)

Офлайн

#3 Апрель 22, 2010 14:04:11

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Fatal Python error

lorien
, попробуйте для выполнения параллельных задач использовать mulitprocessing
хм…. при использовании его, у меня еще более странные вещи начинают твориться: в бесконечном цикле запускаются все новые и новые копии приложения а не функция, указанная в target.
lorien
там даются рекомендации как избежать ошибки
Ткните пожалуйста носом :)
Если не получится решить проблему, придется main.py запускать через execfile, так все работает, но это не очень красиво…
P.S. Теперь и sqlite3 отвалилось, хотя код весь вернул к первоночальному :)



Отредактировано (Апрель 22, 2010 14:18:58)

Офлайн

#4 Апрель 22, 2010 15:03:55

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Fatal Python error

Не помогает….
Почитал так же, что все импорты должны быть завершены до создания потока. Получается, у меня import main до конца еще не выполнен, и я создаю поток. Отсюда все проблемы. Пробовал создавать поток асинхронно, через пару секунд, чтоб import main был завершен…. Хотя… Блин, он же так и не будет завершен, так как в main.py запускается mainloop().
Придется все же в test.py (запускалку) вынести часть кода

upd: Так и сделал, все заработало! lorien спасибо за наводку!



Отредактировано (Апрель 22, 2010 15:17:14)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version