Python pyinotify在创建时读取文件的错误?

Python pyinotify在创建时读取文件的错误?,python,linux,Python,Linux,每次在某个目录中创建新文件时,我都要解析一个文件。为此,我尝试使用来设置一个目录,以监视CREATE内核事件中的,并启动parse()方法 以下是模块: from pyinotify import WatchManager, ThreadedNotifier, ProcessEvent, IN_CREATE class Watcher(ProcessEvent): watchdir = '/tmp/watch' def __init__(self):

每次在某个目录中创建新文件时,我都要解析一个文件。为此,我尝试使用来设置一个目录,以监视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
正在运行):

…但奇怪的是,当直接调用时,它在解释器会话中工作

>>> import watcher
>>> w = watcher.Watcher()
>>> w._parse('/tmp/watch/sample')
['This is a sample file', 'Another line', 'And another...']

为什么会这样?我调试这件事的最远结果是知道有什么东西使pyinotify无法正确读取文件。但是为什么?

您可能想等到文件关闭后再阅读?

正如@silenghost所提到的,您可能在文件中添加任何内容之前阅读了文件(即,您收到的是文件创建通知,而不是文件写入通知)


更新:带有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的确切版本,以及您在这些确切的情况下观察到了什么?很可能,通过更详细的信息,我们可以准确地确定哪个bug或异常给您带来了问题。谢谢

我想我通过使用
IN\u CLOSE\u WRITE
事件解决了这个问题。我不确定在那之前发生了什么使它不起作用

@亚历克斯:谢谢,我试过你的脚本,但我使用的是更新的版本:Python 2.6.1、pyinotify 0.8.6和Linux 2.6.28,所以它对我不起作用


这显然是一个在文件编写之前尝试解析文件的问题,因此SilentGhost和DanM很荣幸能找到它。

是的,可能就是这样。但是,我将事件更改为IN_CLOSE_WRITE,它实际上只有在文件关闭后才会触发,并且仍然得到一个空结果。我还尝试在_parse()调用之前插入一个简单的time.sleep(5),但似乎没有帮助,因为实际上根本没有等待-有没有办法在Python中等待文件关闭?请看我的回复。我将inotify事件更改为IN_CLOSE_WRITE,同样的事情也发生了。如何等待文件完成写入?谢谢你的帮助。:)您的调试已验证您的解析函数是否有效。事件的流动一定有问题。pynotify站点说pynotify.py中有一个可用于调试的详细标志。我还没有看过它的用法,但是启用这个标志可能会提供对事件流的更多了解。你看到你期望的事件了吗?除了在创建中的
之外,你还应该在修改中的
。i、 e.
pyinotify.IN_CREATE | pyinotify.IN_MODIFY
我不知道IN_CLOSE_CREATE是一个inotify事件。。。你有一些支持文件吗?@对不起,我想你发现了一个3岁的打字错误。如果我没有记错的话,我最后在写的时候使用了
Watching /tmp/watch
Seen: event_name: IN_CREATE   is_dir: False   mask: 256   name: c3   path: /tmp/watch   wd: 1   
['ciao']