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

Posted

技术标签:

【中文标题】Python等待并检查文件是不是完全由外部程序创建【英文标题】:Python wait and check if file is created completely by external programPython等待并检查文件是否完全由外部程序创建 【发布时间】:2013-12-02 09:26:45 【问题描述】:

我目前在目录“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 ?

感谢您的时间和考虑。

【问题讨论】:

在创建文件的脚本中,获取一个排他锁。在此脚本中,也尝试获取锁。程序将一直等待,直到获得锁,此时您知道文件已创建。 外部程序是你写的吗?如果没有,您可以从您的脚本运行它(对于只执行其操作然后退出的命令行工具)或编写脚本(例如,对 Windows 或 Mac GUI 应用程序使用 COM 或 AppleScript)吗?在任何一种情况下,都有更好的方法来做到这一点(正如 Waleed Khan 对第一种情况的评论所建议的那样)。如果这些都不正确,则没有方法可以可靠地做到这一点;根据您的平台和您对该程序的了解,您可以想出比您更好的猜测,但这仍然是猜测。 @abarnert,感谢您的关注。编写程序是外部程序,但通过 cmd 从 python 脚本执行。 @JennCole:那你可以等待程序退出,而不是等待它停止写入文件吗?因为等待您启动的程序退出非常容易。 【参考方案1】:

这种方法显然只适用于 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)))

【讨论】:

这不适用于 (a) 除 Windows 以外的任何平台,(b) 在创建文件时多次打开和关闭文件的任何程序,(c) 用于各种文件共享即使在 Windows 上,…… @abarnert (a) 我不知道这一点。您打算如何在其他平台上实现这一目标? (b) 这很明显,如果不是这种情况,我认为 OP 会提供信息。 (c) 你能举一些例子吗? 如果您控制生成数据的其他程序,有很多更好的解决方案。如果没有,真的没有办法确定某人在没有外部信号的情况下完成了文件的写入;您可以通过使用像inotify 这样的fswatch 工具或通过向内核询问文件的所有句柄(例如,通过lsof)等来构建启发式解决方案。但是,如果其他程序没有锁定文件无论如何,您无法检测到文件何时解锁,因为不会发生这种情况。 (这种适用于 Windows,因为默认情况下所有文件打开都会隐式锁定。)

以上是关于Python等待并检查文件是不是完全由外部程序创建的主要内容,如果未能解决你的问题,请参考以下文章

bash 脚本 inotifywait 在继续之前等待文件完全写入

Python tarfile - 检查 tar 中的文件是不是存在于外部(即已被提取)

python:检查特定字符串是不是是文件名的一部分

如何在 Web 驱动程序中检查页面是不是已完全加载?

python检测文件中的文件是不是正在被占用

C++:如何检查外部程序是不是正在运行?