2013-09-27 51 views
9

我有一个python的os.path.getmtime()函数的快速问题。我观察到一些奇怪的行为。我正在开发一个Web应用程序,该应用程序定期检查某个文件是否已被修改,并根据该文件确定是否刷新。python os.path.getmtime()time not changing

在我的本地python命令行中,当我更改文件并调用os.path.getmtime(file_name)时,从mtime返回的值已更改为反映文件中的更改。

但是,当我在我的web应用程序中调用os.path.getmtime()时,更改前后的返回值是相同的。我在网上做了一些研究,发现有些东西建议os模块需要重新加载,以便更改要注册的文件。所以,在我的网络应用程序中,我重新加载了os模块,但mtime仍不能反映文件的更改。有没有其他人遇到过这个问题或知道解决方案?我已经包括了从Web应用程序片断如下代码:

import os 

def function_name(): 
    reload(os) 
    file_path = '/dir/lib/some_file.js' 

    try: 
     mtime = os.path.getmtime(file_path) 
    except os.error: 
     pass 

    return mtime 
+1

不,重新加载'os'模块**没有任何**与此相关。 –

+0

啊,好吧。是的,我在其中一个python文档中看到,只有在加载os模块时才设置“os.environ”,我认为这可能与此有关。 –

+1

'os.path.getmtime()'不会缓存任何东西。它只是返回'os.stat(filename).st_mtime'。 'os.stat()'不会缓存任何东西,它只是调用C库,它会向操作系统询问该信息。 –

回答

0

也许你可以尝试让一般统计上的文件之外的mtime如大小。

是服务器更改前后(即在终端窗口中查看ls -l时)文件的预期大小/ mtime是相同还是不同。

如果使用这些命令行工具时的统计信息是相同的,那么它可能是文件没有被编辑的地方,你认为。

如果大小/修改时间是不同的或者用

os.stat(filename) 

,看看它是否提供任何正确的价值观的。

1

我没有足够的声誉添加为评论...

目前尚不清楚你如何测试,你的web应用程序

  • 打印的mtime
  • 的一个单页
  • 更新文件
  • 打印的mtime

或者

  • 简单打印的mtime

如果你的web应用程序测试过程

  • 要求测试的mtime页
  • 手动更新文件
  • 要求测试的mtime页
  • 记那两个页面浏览的mtime是相同的

我的第一个猜测是Web客户端,代理或服务器缓存。

1

我今天遇到这个,发现这个问题,所以我想我会在这里记录它。我的情况是单元测试,因此它可能会略有不同,因为它涉及比手动测试更小的时间尺度。

修改时间受到文件系统的限制。如果检查修改时间,然后写入少量数据,然后再次检查修改时间,则两个时间戳可能完全相等。如果第一次时间戳检查和写入结束之间的时间小于时间分辨率,它们将相等。

上各种常见文件系统的时间分辨率有人统计:

  • FAT32:2S
  • EXT3:1秒
  • 的exFAT:10ms的
  • NTFS:100ns的
  • EXT4:1ns的

你可以期待嵌入式系统使用FAT,并且有一个ti我2秒的分辨率。较旧的Windows系统将在2秒的范围内。较新的Windows系统将有100ns或10ms。较早的UNIX系统通常会有1个。较新的UNIX系统将具有1ns的分辨率。

如果<time for time stamp check> + <time for file write>小于时间分辨率,则文件可能显示为未被修改。

我看到这些可能的解决方案:

  • 包括在你写的文件的文件头更准确的修改时间。文件编写者甚至可以在写入之前检查文件是否已经存在,并将纳秒修改时间增加至少1,以确保更新(以时间戳精度为代价)。
  • 在其他地方存储每个文件被编辑的频率。使用此编号查看自上次检查后是否进行了编辑。请注意,可能无法以原子方式写入文件并一起更新修改计数。
  • 也许一些欺骗可以设计睡觉,这样的第一次时间戳检查和文件写入之间的时间总是至少是最小时间分辨率。这将很大程度上取决于您的设置类型,并且会阻止该线程。