实际上我将从我的application1输入到input.txt,实习生触发{used pyinotify} program1来运行这个更新output.txt文件的program1,但是从output.txt读取的application1不等待program1要完成对文本文件(output.txt)的写入过程,它会从output.txt中读取旧数据。我需要Application1等待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 program1的程序,在此触发后,application1执行此语句out_file=open("/var/www/cgi-bin/output.txt", "r").read()
现在,application1在由program1更新之前获取输出内容!!我希望Aplication1等待program1完成对output.txt的运行和更新
请给我一个想法,我该怎么办呢......
谢谢:)
答案 0 :(得分:3)
有几种方法可以在Python中观察文件更改,其中大部分都是特定于平台的。由于您没有指定您的平台,因此这是一个跨平台的包: http://packages.python.org/watchdog/
您还应该看一下这个问题的答案: How do I watch a file for changes?
来自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,那么如果您在将写入的数据刷新到文件之前得到该事件,我不会感到惊讶。