python windows目录mtime:如何检测程序包目录新文件?

python windows目录mtime:如何检测程序包目录新文件?,python,windows-xp,Python,Windows Xp,我正在开发一个自动重新加载功能 (因此您必须减少重启HTTP服务器的频率,最好不要重启) 我有以下代码来重新加载包模块“location” 如果将文件添加到包目录中。它在Windows XP上不工作。 我怎样才能修好它?我认为问题在于getmtime(dir)没有 目录内容更改时是否在Windows上更改? 我真的不想将os.listdir(dir)与上一个目录进行比较 每次我访问包时的内容 if not do_reload and hasattr(locatio

我正在开发一个自动重新加载功能 (因此您必须减少重启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

欢迎提出其他建议。我对此不满意…

您可以尝试使用getatime()来代替。

我不完全理解您的问题


您是在目录或单个文件上调用getmtime()?

好久不见。我不确定您到底在做什么,但与您的代码相当:

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)
是(per),假设parentname命名一个包,partname命名该包中的一个模块(如果partname是parentname包的顶级名称,如函数或类,则必须在末尾使用getattr):


如果没有exec或任何奇怪的东西,只需适当地将其称为
f

关于您的第一个代码片段,有两件事与我有关:

  • 您将浮点从getmtime强制转换为int。根据此代码的运行频率,您可能会得到不可靠的结果

  • 在代码末尾,将dir_mtime分配给变量md_mtime。fn_mtime,您对照检查,似乎没有更新


它看起来不像。atime实际上在mtime>>>os.path.getatime(“根”)1247371200.0>>>os.path.getmtime(“根”)1238624574.0我很抱歉反对,但你的atime比你的mtime年轻:1247371200.0-1238624574.0=8746626.0因为这些是从纪元开始的秒,更大意味着更年轻,所以atime在mtime之后。然而,当我在目录中创建一个文件时,atime不会改变。mtime呢?这似乎更相关。这是我在XPsp2机器上得到的结果:In[24]:t1=os.path.getmtime(“d:/tmp”)In[25]:t1 Out[25]:1247511520.796875 In[26]:shutil.copyfile(“d:/tmp/test.txt”,“d:/tmp/test1.txt”)In[27]:t2=os.path.getmtime(“d:/tmp”)In[28]:t2 Out[28]:1247511548.140625 In[29]:t2-t1 Out[29]:27.34375看起来非常完美。添加条目可能不需要读取目录,因此atime不需要更改。正如我所说,当您从目录中添加或删除文件(在顶层)时,对于我使用的Windows XP版本,目录的mtime()不会更改.我正在一个目录上调用getmtime,该目录是模块的包目录。我正在查看该目录中是否有任何项被修改……我希望有一个通用的pythonic解决方案。Meh..以上特定于win32的解决方案(需要维护blech代码,需要额外的复杂性来破坏东西)。。或者..一个os.listdir记帐类型系统(不合法,可能是通用的)也许你可以统计目录或者(如果需要的话,可以统计内容)…假设os.stat按需要工作(即目录的内容影响目录本身的属性)很好,实际上我只需要知道文件是否被添加(可能被删除)。stat(dir)没有帮助。我尝试了它,它在将文件添加到目录之前和之后返回了完全相同的值。只要看一下os.stat(dir)就会给出缩写值。正如我所说,在我的笔记本电脑上运行的Windows XP版本的顶层目录中添加文件时,目录的stat()值不会改变。谢谢Alex。我想这就是我需要的工作。我所做的是尝试使它成为这样,如果您在(比如)Apache/mod_wsgi下安装了一个WHIFF目录,那么即使您添加了一个新模块,您也不需要重新启动Apache或mod_wsgi。对于软件包,至少有一个版本的Windows XP(我笔记本电脑上的版本)无法检查目录mtime。所以我想如果我遇到导入错误,我必须尝试动态导入。对于其他情况,我可以检查源文件的mtime,这似乎很有效。嗨,Aaron,是的,我的解决方案似乎可以工作——否则请让我们知道,但是如果您可以验证它是否有效,那么请按照正常的SO礼仪接受我的回答!)
defn = GET_MODULE_FUNCTION % {"parent": parentname, "child": partname}
exec(defn)
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]