13

os.path.getmtime()我对 python 的功能有一个快速的问题。我观察到一些奇怪的行为。我正在开发一个网络应用程序,该应用程序会定期检查某个文件是否已被修改,并据此决定是否刷新。

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

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

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
4

3 回答 3

3

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

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

各种常见文件系统时间分辨率的一些统计:

  • FAT32:2s
  • 分机3:1秒
  • exFAT:10毫秒
  • NTFS:100ns
  • ext4:1ns

您可以期望嵌入式系统使用 FAT,并具有 2 秒的时间分辨率。较旧的 Windows 系统将在 2 秒范围内。较新的 Windows 系统将有 100ns 或 10ms。较旧的 UNIX 系统通常有 1。较新的 UNIX 系统将具有 1ns 的分辨率。

如果<time for time stamp check> + <time for file write>小于时间分辨率,文件可能看起来好像没有修改。

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

  • 在您正在编写的文件的标题中包含更准确的修改时间。文件编写者甚至可以在写入之前检查文件是否已经存在,并将纳秒修改时间至少增加 1 以保证它更新(以时间戳准确性为代价)。
  • 在别处存储每个文件的编辑频率。使用此编号可查看自您上次检查以来是否已对其进行过编辑。请注意,可能无法以原子方式写入文件并同时更新修改计数。
  • 也许可以用睡眠设计一些技巧,使得第一次时间戳检查和文件写入之间的时间始终至少是最小时间分辨率。这在很大程度上取决于您的设置类型,并且会阻塞线程。
于 2016-08-29T02:02:33.860 回答
1

I don't have enough reputation to add this as a comment...

It is not clear how you are testing, does one single page of your web app

  • print mtime
  • update the file
  • print mtime

Or

  • simply print mtime

If your web-app test process is

  • request test mtime page
  • manually update the file
  • request test mtime page
  • note that mtime is same on both page views

my first guess is web client, proxy, or server caching.

于 2013-10-03T12:33:34.303 回答
0

也许您可以尝试获取除 mtime 之外的文件的一般统计信息,例如大小。

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

如果使用此类命令行工具时的统计信息相同,则可能是文件未在您认为的位置进行编辑。

如果大小/mtime 不同,可能使用

os.stat(filename)

看看它是否给出了任何正确的值。

于 2013-10-01T16:28:33.433 回答