Папка Python для Windows Mtime: как определить новый файл каталога директории? - PullRequest
0 голосов
/ 12 июля 2009

Я работаю над функцией автоматической перезагрузки для 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

Другие предложения приветствуются. Я не рад этому ...

Ответы [ 4 ]

2 голосов
/ 13 июля 2009

давно не виделись.Я не совсем уверен, что вы делаете, но эквивалент вашего кода:

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
"""

для exec ed с:

defn = GET_MODULE_FUNCTION % {"parent": parentname, "child": partname}
exec(defn)

((* 1008)* docs ), предполагая, что parentname называет пакет, а partname именует модуль в этом пакете (если partname является именем верхнего уровня пакета parentname, такого как функция или класс, вам придется использовать getattrв конце):

import sys

def f(parentname, partname):
    name = '%s.%s' % (parentname, partname)
    try:
        __import__(name)
    except ImportError:
        parent = __import__(parentname)
        reload(parent)
        __import__(name)
    return sys.modules[name]

без exec или чего-нибудь странного, просто назовите это f соответствующим образом.

0 голосов
/ 14 июля 2009

В вашем первом фрагменте кода есть две вещи, которые меня беспокоят:

  • Вы разыгрываете float от getmtime до int. В зависимости от частоты выполнения этого кода вы можете получить ненадежные результаты.

  • В конце кода вы назначаете dir_mtime переменной md_mtime. fn_mtime, который вы проверяете, похоже, не обновляется.

0 голосов
/ 12 июля 2009

Я не совсем понимаю ваш вопрос ...

Вы вызываете getmtime () для каталога или отдельного файла?

0 голосов
/ 12 июля 2009

вместо этого вы можете попробовать использовать getatime ().

...