Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅在使用python更新输入文件后才从中读取文本_Python_Input_Inotify_Pyinotify - Fatal编程技术网

如何仅在使用python更新输入文件后才从中读取文本

如何仅在使用python更新输入文件后才从中读取文本,python,input,inotify,pyinotify,Python,Input,Inotify,Pyinotify,实际上,我将从我的应用程序1向input.txt提供输入,intern触发{used pyinotify}program1运行这个更新output.txt文件的程序1,但是从output.txt读取的应用程序1并不等待program1完成对文本文件(output.txt)的写入过程,而是从output.txt读取旧数据。我需要应用程序1等待程序1的过程完成我如何才能做到这一点 import pyinotify,subprocess def onChange(ev): cmd = ['/u

实际上,我将从我的应用程序1向input.txt提供输入,intern触发{used pyinotify}program1运行这个更新output.txt文件的程序1,但是从output.txt读取的应用程序1并不等待program1完成对文本文件(output.txt)的写入过程,而是从output.txt读取旧数据。我需要应用程序1等待程序1的过程完成我如何才能做到这一点

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\u file=open(“/var/www/cgi-bin/output.txt”,“r”)。read()

现在application1在程序1更新输出内容之前获取输出内容!!我希望应用程序1等待程序1在output.txt上完成运行和更新

请告诉我怎么做


谢谢:)

在Python中有几种方法可以监视文件更改,其中大多数是特定于平台的。由于您没有指定平台,这里有一个跨平台包:

你还应该看看这个问题的答案:

编辑 从inotify常见问题解答:


Q:IN\u MODIFY和IN\u CLOSE\u WRITE有什么区别? IN_MODIFY事件在文件内容更改时发出(例如,通过write()系统调用),而IN_CLOSE_写入在关闭更改的文件时发生。这意味着每个更改操作都会导致一个IN_MODIFY事件(在对打开的文件进行操作时可能会发生多次),而IN_CLOSE_WRITE只会发出一次(在关闭文件时)

Q:在修改或写入中使用更好吗? 情况因人而异。通常情况下,它更适合于在_CLOSE _WRITE中使用,因为如果发出,则相应文件上的所有更改都会安全地写入文件中。IN_MODIFY事件不一定意味着文件更改完成(数据可能保留在应用程序的内存缓冲区中)。另一方面,许多日志和类似文件必须使用IN_MODIFY进行监控,在这种情况下,这些文件是永久打开的,因此无法发出IN_CLOSE_WRITE



你确定你在仔细观察吗?如果您观察IN_MODIFY,那么如果您在写入数据刷新到文件之前收到事件,我不会感到惊讶。

您是启动程序1还是一直在运行?换句话说,有没有办法监控程序1或从中获取信号,使您知道它已完成?这是一种更好、更简单的方法。实际上,我从我的应用程序1向input.txt提供输入,intern会触发{used Pyintify}program1来运行更新output.txt文件的程序1,但从output.txt读取的应用程序1不会等待program1完成对文本文件(output.txt)的写入过程,它从output.txt读取旧数据。我需要应用程序1等待程序1的进程完成,我怎么做呢?谢谢先生,我想我明白你的意思了,非常感谢:)我会看看这个,然后再给你回复:)我已经编辑了描述并添加了代码,请建议我对它做必要的修改:)@Bhuvan:我这里没有linux,所以我不能测试任何代码。但显然,您需要再次使用pyinotify来查看output.txt。当您得到一个
IN_CLOSE_WRITE
事件时,您就知道version2_1.py已经安全地完成了对文件的写入。目前,watchdog实际上是一个相当糟糕的选择,因为它为IN_MODIFY、IN_CLOSE_WRITE和IN_ATTRIB发出相同的修改事件。