仅在使用python更新后如何从输入文件中读取文本
Posted
技术标签:
【中文标题】仅在使用python更新后如何从输入文件中读取文本【英文标题】:How to read a text from input file only after it is updated using python 【发布时间】:2011-05-14 07:47:48 【问题描述】:实际上我会将来自我的 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 程序 1 的程序,在此触发后应用程序 1 执行此语句out_file=open("/var/www/cgi-bin/output.txt", "r").read()
现在 application1 在 program1 更新之前获取输出内容!我希望 Aplication1 等待 program1 完成对 output.txt 的运行和更新
请给我一个想法,我该怎么做..
谢谢你:)
【问题讨论】:
您是启动 program1 还是一直在运行?换句话说,有没有办法监控 program1 或从中获取信号,以便您知道它已完成?这是迄今为止更好、更简单的方法。 实际上我将 application1 的输入提供给 input.txt,实习生触发 used pyinotify program1 运行更新 output.txt 文件的 program1,但从 output.txt 读取的 application1 没有t 等待 program1 完成对文本文件(output.txt)的写入过程,它从 output.txt 中读取旧数据。我需要 Application1 等待 program1 的进程完成我该怎么做?? 【参考方案1】:有几种方法可以在 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,那么如果您在写入的数据刷新到文件之前收到事件,我不会感到惊讶。
【讨论】:
谢谢先生,我想我明白了你的意思,非常感谢:) 我会看看这个并回复你:) 我已经编辑了描述并添加了我所做的代码,请建议我对其进行必要的更改:) @Bhuvan:我这里没有 linux,所以我无法测试任何代码。但显然你需要使用 pyinotify again 来观看 output.txt。当您收到IN_CLOSE_WRITE
事件时,您就知道 version2_1.py 已安全完成对文件的写入。
目前,看门狗实际上是一个相当糟糕的选择,因为它为 IN_MODIFY、IN_CLOSE_WRITE 和 IN_ATTRIB 发出相同的修改事件。以上是关于仅在使用python更新后如何从输入文件中读取文本的主要内容,如果未能解决你的问题,请参考以下文章