如何在文件更新后使用python读取文本
其实,我的应用程序1会把输入写入到input.txt文件,这样就会触发一个叫做program1的程序(我用的是pyinotify),这个program1会更新output.txt文件。但是,应用程序1在读取output.txt的时候,并不会等program1完成写入,它会读取到output.txt里的旧数据。我需要应用程序1等program1完成后再继续读取,这该怎么做呢?
import pyinotify,subprocess
def onChange(ev):
cmd = ['/usr/bin/env', 'python','/var/www/cgi-bin/version2_1.py', ev.pathname]
subprocess.Popen(cmd).communicate()
wm = pyinotify.WatchManager()
wm.add_watch('/var/www/cgi-bin/input.txt', pyinotify.IN_CLOSE_WRITE, onChange)
notifier = pyinotify.Notifier(wm)
notifier.loop()
这是我用来在后台运行我的python程序1的程序,它会在输入文本触发后执行,紧接着应用程序1就会执行这条语句 out_file=open("/var/www/cgi-bin/output.txt", "r").read()
现在,应用程序1在program1更新output.txt之前就拿到了内容!我希望应用程序1能等program1完成运行并更新output.txt后再读取。
请给我一些建议,我该怎么做呢?
谢谢你 :)
1 个回答
在Python中,有几种方法可以监控文件的变化,大部分方法都是针对特定平台的。因为你没有说明你的平台,这里推荐一个跨平台的包:http://packages.python.org/watchdog/
你还可以看看这个问题的答案:如何监控文件变化?
编辑
来自inotify常见问题解答:
问:IN_MODIFY和IN_CLOSE_WRITE有什么区别?
IN_MODIFY事件是在文件内容发生变化时触发的(比如通过write()系统调用),而IN_CLOSE_WRITE是在关闭已修改的文件时触发。这意味着每次修改操作都会产生一个IN_MODIFY事件(在操作打开的文件时可能会多次触发),而IN_CLOSE_WRITE只会在关闭文件时触发一次。
问:使用IN_MODIFY还是IN_CLOSE_WRITE更好?
这要根据具体情况而定。通常来说,使用IN_CLOSE_WRITE更合适,因为如果这个事件被触发,说明所有对该文件的修改都已经安全地写入文件中。IN_MODIFY事件并不一定意味着文件的修改已经完成(数据可能还在应用程序的内存缓冲区中)。另一方面,很多日志文件和类似的文件需要使用IN_MODIFY来监控,因为这些文件通常是一直打开的,因此不会触发IN_CLOSE_WRITE。
你确定你在观察IN_CLOSE_WRITE吗?如果你在观察IN_MODIFY,那么在数据写入文件之前就收到事件我也不会感到惊讶。