2009-07-12 78 views
0

我正在使用WHIFF的自動重新加載功能 http://whiff.sourceforge.net (因此您不得不少次重新啓動HTTP服務器,理想情況是永遠不要)。python windows目錄mtime:如何檢測軟件包目錄中的新文件?

如果將文件添加到軟件包目錄,我有以下代碼來重新加載軟件包模塊「位置」 。它不適用於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」是從記錄的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 

其他建議歡迎。我對此不高興......

回答

2

好久不見。我不知道你在做什麼,而是你的代碼相當於:

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) 

(每the docs),假設parentname名包和零件名稱名稱在包裝模塊(如果零件名稱是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] 

沒有可執行文件或任何奇怪的,只是適當地調用這個f

0

您可以嘗試使用getatime()代替。

+0

它看起來不像它。 atime實際上是在*時間之前* os.path。getatime( 「根」) 1247371200.0 >>> os.path.getmtime( 「根」) 1238624574.0 – 2009-07-12 15:15:33

+0

對不起反對,但你的atime比你的mtime年輕: 1247371200.0 - 1238624574.0 = 8746626.0 由於這些是自時代以來的秒,大意味着更年輕,所以atime是_after_mtime。 – ThomasH 2009-07-12 21:05:02

+0

哎呀。不過,當我在目錄中創建文件時,atime不會更改。 – 2009-07-13 00:11:09

0

我不理解你的問題完全...

你叫上的目錄或單個文件getmtime()?

0

有關於你的第一個代碼兩件事代碼段中關注我:

  • 你施放浮動從getmtime爲int。這個代碼運行的頻率依賴性,你可能會得到不可靠的結果。

  • 在代碼結束時,您將dir_mtime分配給變量md_mtime。您檢查的fn_mtime似乎沒有更新。

相關問題