Найти - Пользователи
Полная версия: Fatal Python error
Начало » Python для экспертов » Fatal Python error
1
igor.kaist
Доброго времени суток.
Возник достаточно неожиданный баг.
В программе используется 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
igor.kaist
Вроде что то похожее:
имеем файл 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 можно было обновлять через систему обновлений программы. Как выкрутиться? И вообще, откуда такая ошибка возникает?
igor.kaist
lorien
, попробуйте для выполнения параллельных задач использовать mulitprocessing
хм…. при использовании его, у меня еще более странные вещи начинают твориться: в бесконечном цикле запускаются все новые и новые копии приложения а не функция, указанная в target.
lorien
там даются рекомендации как избежать ошибки
Ткните пожалуйста носом :)
Если не получится решить проблему, придется main.py запускать через execfile, так все работает, но это не очень красиво…
P.S. Теперь и sqlite3 отвалилось, хотя код весь вернул к первоночальному :)
igor.kaist
Не помогает….
Почитал так же, что все импорты должны быть завершены до создания потока. Получается, у меня import main до конца еще не выполнен, и я создаю поток. Отсюда все проблемы. Пробовал создавать поток асинхронно, через пару секунд, чтоб import main был завершен…. Хотя… Блин, он же так и не будет завершен, так как в main.py запускается mainloop().
Придется все же в test.py (запускалку) вынести часть кода

upd: Так и сделал, все заработало! lorien спасибо за наводку!
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