仅在使用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更新后如何从输入文件中读取文本的主要内容,如果未能解决你的问题,请参考以下文章

从标准输入读取所有文本到字符串

如何使用 python 从 PDF 表单中读取数据

如何使用Python脚本从PDF中读取阿拉伯语文本

如何使用 Python 从 PDF 文件中读取简单文本?

如何从python中的图像中删除某些文本?

如何用VBS逐行读取文本文件的内容,并输入变量