2013-09-27 83 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,以確保更新(以時間戳精度爲代價)。
  • 在其他地方存儲每個文件被編輯的頻率。使用此編號查看自上次檢查後是否進行了編輯。請注意,可能無法以原子方式寫入文件並一起更新修改計數。
  • 也許一些欺騙可以設計睡覺,這樣的第一次時間戳檢查和文件寫入之間的時間總是至少是最小時間分辨率。這將很大程度上取決於您的設置類型,並且會阻止該線程。