Я работаю над функцией автоматической перезагрузки для WHIFF
http://whiff.sourceforge.net
(поэтому вам придется перезапускать HTTP-сервер реже, в идеале никогда).
У меня есть следующий код для перезагрузки модуля пакета "location"
если файл добавлен в каталог пакета. Это не работает на Windows XP.
Как я могу это исправить? Я думаю, проблема в том, что getmtime (dir) не
изменить в Windows при изменении содержимого каталога?
Я бы действительно не хотел сравнивать os.listdir (dir) с последним каталогом
содержимое каждый раз, когда я получаю доступ к пакету ...
if not do_reload and hasattr(location, "__path__"):
path0 = location.__path__[0]
if os.path.exists(path0):
dir_mtime = int( os.path.getmtime(path0) )
if fn_mtime<dir_mtime:
print "dir change: reloading package root", location
do_reload = True
md_mtime = dir_mtime
В коде "fn_mtime" - это записанное время от последней (повторной) загрузки.
... добавил комментарий: я придумал следующую работу, которая, я думаю,
может работать, но меня это не сильно волнует, так как это связано с генерацией кода.
Я динамически генерирую фрагмент кода для загрузки модуля и, если он не работает
он пытается снова после перезагрузки. Еще не проверено.
GET_MODULE_FUNCTION = """
def f():
import %(parent)s
try:
from %(parent)s import %(child)s
except ImportError:
# one more time...
reload(%(parent)s)
from %(parent)s import %(child)s
return %(child)s
"""
def my_import(partname, parent):
f = None # for pychecker
parentname = parent.__name__
defn = GET_MODULE_FUNCTION % {"parent": parentname, "child": partname}
#pr "executing"
#pr defn
try:
exec(defn) # defines function f()
except SyntaxError:
raise ImportError, "bad function name "+repr(partname)+"?"
partmodule = f()
#pr "got", partmodule
setattr(parent, partname, partmodule)
#pr "setattr", parent, ".", partname, "=", getattr(parent, partname)
return partmodule
Другие предложения приветствуются. Я не рад этому ...