Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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_File_Python 3.x_Time_Thread Safety - Fatal编程技术网

Python等待并检查文件是否完全由外部程序创建

Python等待并检查文件是否完全由外部程序创建,python,file,python-3.x,time,thread-safety,Python,File,Python 3.x,Time,Thread Safety,我目前在目录'DIR'中的文件中有外部程序输出。现在,如果我想从python中查看文件是否已完全创建,如何检查该文件,以及是否已完成执行程序 我的研究表明,这可以通过 os.path.isfile(FILE_NAME) 但我如何继续检查,在某种程度上它不会打乱其他程序。这是我的一个想法?请让我知道如何做到这一点?还是我的模板足够好 counter = 0; While os.path.isfile(FILE_NAME) == False: Time.Sleep(3) counter +=

我目前在目录'DIR'中的文件中有外部程序输出。现在,如果我想从python中查看文件是否已完全创建,如何检查该文件,以及是否已完成执行程序

我的研究表明,这可以通过

os.path.isfile(FILE_NAME)
但我如何继续检查,在某种程度上它不会打乱其他程序。这是我的一个想法?请让我知道如何做到这一点?还是我的模板足够好

counter = 0;

While os.path.isfile(FILE_NAME) == False:
 Time.Sleep(3)
 counter += 1

if counter < 5:
   # I guess we are good at this point ?
计数器=0;
而os.path.isfile(文件名)==False:
时间。睡眠(3)
计数器+=1
如果计数器<5:
#我想我们在这一点上做得不错吧?

谢谢你的时间和考虑

此方法显然只适用于Windows(参考下面的注释),并且依赖于这样一个事实,即您的外部程序在创建文件时只打开和关闭文件一次

import time

filename = 'my_file.txt'
while True:
    try:
        with open(filename, 'rb') as _:
            break
    except IOError:
        time.sleep(3)
如果要设置访问尝试次数的最大限制,可以执行以下操作:

import time

filename = 'my_file.txt'
max_i = 10

for i in xrange(max_i):
    try:
        with open(filename, 'rb') as _:
            break
    except IOError:
        time.sleep(3)
else:
    raise IOError('Could not access {} after {} attempts'.format(filename, str(max_i)))

在创建文件的脚本中,获取文件的独占锁。在这个脚本中,还要尝试获取一个锁。程序将一直等到获得锁,此时您知道文件已创建。您是否编写了外部程序?如果没有,您是否可以从脚本中运行它(对于只执行其操作然后退出的命令行工具)或编写脚本(例如,使用COM或AppleScript编写Windows或Mac GUI应用程序)?在这两种情况下,都有更好的方法来做到这一点(正如瓦利德·汗对第一种情况的评论所表明的那样)。如果这两个都不正确,就没有可靠的方法来做到这一点;根据您的平台和您对该程序的了解,您可以做出比您更好的猜测,但仍然是猜测。@abarnert,谢谢您的关注。编写程序的是外部程序,但通过cmd从python脚本执行。@JennCole:那么,您是否可以只等待程序退出,而不只是等待它停止写入文件?因为等待你启动的程序退出是很容易的。这在(a)除Windows之外的任何平台上都不起作用,(b)在创建文件时多次打开和关闭文件的任何程序,(c)即使在Windows上也有各种文件共享,…@abarnert(a)我不知道这一点。您打算如何在其他平台上实现这一点?(b) 这是很明显的,如果不是这样的话,我认为OP会提供信息。(c) 你能提供一些例子吗?如果你控制另一个程序,也就是生成数据的程序,有很多更好的解决方案。如果没有,就无法确定是否有人在没有外部信号的情况下完成了文件的编写;您可以通过使用fswatch工具(如
inotify
)或向内核请求文件的所有句柄(例如,通过
lsof
)等)来构建启发式解决方案。但是,如果其他程序没有以任何方式锁定文件,则无法检测文件何时被解锁,因为不会发生这种情况。(这种方式在Windows上工作,因为默认情况下,所有文件都以隐式锁定方式打开。)