![](/img/trans.png)
[英]Using pyinotify to watch for file creation, but waiting for it to be completely written to disk
[英]pyinotify bug with reading file on creation?
我想在每次在某個目錄中創建新文件時解析文件。 為此,我正在嘗試使用pyinotify來設置目錄以監視IN_CREATE
內核事件,並觸發parse()
方法。
這是模塊:
from pyinotify import WatchManager,
ThreadedNotifier, ProcessEvent, IN_CREATE
class Watcher(ProcessEvent):
watchdir = '/tmp/watch'
def __init__(self):
ProcessEvent.__init__(self)
wm = WatchManager()
self.notifier = ThreadedNotifier(wm, self)
wdd = wm.add_watch(self.watchdir, IN_CREATE)
self.notifier.start()
def process_IN_CREATE(self, event):
pfile = self._parse(event.pathname)
print(pfile)
def _parse(self, filename):
f = open(filename)
file = [line.strip() for line in f.readlines()]
f.close()
return file
if __name__ == '__main__':
Watcher()
問題是_parse返回的列表在被新文件創建事件觸發時為空 (如下所示)(該文件在watcher.py
運行時在另一個窗口中創建):
$ python watcher.py
[]
...但奇怪的是,它直接調用時從解釋器會話開始工作。
>>> import watcher
>>> w = watcher.Watcher()
>>> w._parse('/tmp/watch/sample')
['This is a sample file', 'Another line', 'And another...']
為什么會這樣? 我調試這個東西的最遠的地方就是要知道有些東西正在使pyinotify無法正確讀取文件。 但為什么?
可能你想等到文件關閉?
正如@SilentGhost所提到的,您可能在將任何內容添加到文件之前讀取該文件(即,您將收到有關文件創建而非文件寫入的通知)。
更新:使用pynotify tarball的loop.py示例會將inotify事件序列轉儲到屏幕上。 要確定需要觸發的事件,請啟動loop.py以監視/ tmp,然后執行要跟蹤的文件操作。
這里有一些適合我的代碼,2.6.18內核,Python 2.4.3和pyinotify 0.7.1 - 你可能正在使用其中一些版本的不同版本,但重要的是要確保我們談論的是相同的版本,我認為......:
#!/usr/bin/python2.4
import os.path
from pyinotify import pyinotify
class Watcher(pyinotify.ProcessEvent):
watchdir = '/tmp/watch'
def __init__(self):
pyinotify.ProcessEvent.__init__(self)
wm = pyinotify.WatchManager()
self.notifier = pyinotify.ThreadedNotifier(wm, self)
wdd = wm.add_watch(self.watchdir, pyinotify.EventsCodes.IN_CREATE)
print "Watching", self.watchdir
self.notifier.start()
def process_IN_CREATE(self, event):
print "Seen:", event
pathname = os.path.join(event.path, event.name)
pfile = self._parse(pathname)
print(pfile)
def _parse(self, filename):
f = open(filename)
file = [line.strip() for line in f]
f.close()
return file
if __name__ == '__main__':
Watcher()
當它在終端窗口中運行時,在另一個終端窗口中我這樣做
echo "ciao" >/tmp/watch/c3
這個程序的輸出是:
Watching /tmp/watch
Seen: event_name: IN_CREATE is_dir: False mask: 256 name: c3 path: /tmp/watch wd: 1
['ciao']
正如所料。 那么請你試試這個腳本(當然,如果需要,可以在hashbang中修復Python版本)並告訴我們你正在使用的Linux內核,pyinotify和Python的確切版本,以及你在這些確切的環境中觀察到了什么? 很可能有更詳細的信息,我們可以確定哪個錯誤或異常正在給你帶來問題。 謝謝!
我想我通過使用IN_CLOSE_WRITE
事件來解決問題。 我不確定之前發生了什么讓它無法正常工作。
@Alex:謝謝,我試過你的腳本,但是我使用的是更新的版本:Python 2.6.1,pyinotify 0.8.6和Linux 2.6.28,所以它對我不起作用。
這絕對是在編寫文件之前嘗試解析文件的問題,所以感謝SilentGhost和DanM搞清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.