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

6

我目前有一个外部程序在'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 ?

感谢您的时间和考虑。

1
在创建文件的脚本中,对其进行独占锁定。在此脚本中,也尝试获取锁。程序将等待直到锁被获取,在此时您就知道文件已被创建。 - Waleed Khan
你写了外部程序吗?如果没有,你能否从你的脚本中运行它(对于一个只执行其功能然后退出的命令行工具)或者编写脚本来运行它(例如对于 Windows 或 Mac GUI 应用程序使用 COM 或 AppleScript)?在这两种情况下,都有更好的方法来做到这一点(就像 Waleed Khan 的评论所建议的第一个案例)。如果这两种情况都不是真的,那么就没有可靠的方法来实现它;根据你的平台和你对程序的了解程度,你可以比现在更好地猜测,但仍然只是猜测。 - abarnert
@abarnert,感谢您的关注。这是一个外部程序,用于编写程序,但是通过cmd从Python脚本执行。 - Jenn Cole
@JennCole:那么你可以等待程序退出,而不仅是等待它停止写入文件吗?因为等待你启动的程序退出非常容易。 - abarnert
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)))

1
这个在除了Windows之外的任何平台上都不起作用,也不能与在创建文件时多次打开和关闭文件的程序一起使用,甚至在Windows上也不能与各种文件共享一起使用。 - abarnert
(a)我不知道这个。你会如何在其他平台上实现这个?(b)这很明显,我认为如果情况不是这样的话,OP会提供信息。(c)你能提供一些例子吗? - Steinar Lima
3
如果你控制着生成数据的“另一个”程序,那么就有许多更好的解决方案。如果没有控制权,确实没有办法确定某个文件是否已经完成编写而不需要外部信号;可以使用诸如inotify这样的fswatch工具或通过询问内核获取文件的所有句柄(例如,通过 lsof)等方式构建启发式解决方案。但是,如果另一个程序没有以任何方式锁定文件,那么你无法检测到它何时解除了文件的锁定,因为并没有这样的事情发生。(这在Windows上有效,因为所有文件打开默认都会隐式锁定。) - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接