簡體   English   中英

pyinotify bug與創建時讀取文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM