![](/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.