Python pyinotify在创建时读取文件的错误?
每次在某个目录中创建新文件时,我都要解析一个文件。为此,我尝试使用来设置一个目录,以监视CREATE内核事件中的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):
,并启动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']