我想找出一种方法来警告python脚本文件完成复制。这是场景:
脚本通过不断轮询to_print
来监视文件夹os.listdir()
。
每当os.listdir()
返回存在以前未曾见过的文件的文件列表时,脚本就会对该文件执行一些操作,包括打开它并操纵其内容。
当文件较小时,这很好,并且将文件从其原始源复制到正在观看的目录所花费的时间少于os.listdir()
下次轮询之前的剩余时间。但是,如果轮询并找到文件,但它仍处于被复制的过程中,则当脚本尝试对其执行操作时,文件内容将损坏。
相反,我希望能够(使用os.stat
或其他方式)知道当前正在复制文件,并等待它完成,直到我采取行动为止。
我目前的想法是每次找到新文件时都使用os.stat()
,然后等到下次轮询并比较自上次轮询以来修改/创建的日期,如果它们保持不变那么该文件是“稳定的”,否则保持轮询直到它。我不确定这会工作,因为我不太熟悉Linux / Unix如何更新这些值。
答案 0 :(得分:2)
尝试inotify。
这是用于观看文件的Linux标准。对于您的用例,事件IN_CLOSE_WRITE
似乎很有希望。有一个Python library for inotify。一个非常简单的例子(取自there)。您需要修改它以仅捕获IN_CLOSE_WRITE
个事件。
# Example: loops monitoring events forever.
#
import pyinotify
# Instanciate a new WatchManager (will be used to store watches).
wm = pyinotify.WatchManager()
# Associate this WatchManager with a Notifier (will be used to report and
# process events).
notifier = pyinotify.Notifier(wm)
# Add a new watch on /tmp for ALL_EVENTS.
wm.add_watch('/tmp', pyinotify.ALL_EVENTS) # <-- replace by IN_CLOSE_WRITE
# Loop forever and handle events.
notifier.loop()
以下是一个广泛的API文档:http://seb-m.github.com/pyinotify/
答案 1 :(得分:1)
由于可以在轮询间隔内复制文件,因此在检查新文件之前,只需处理 last 轮询找到的新文件。换句话说,而不是:
while True:
newfiles = check_for_new_files()
process(newfiles)
time.sleep(pollinterval)
这样做:
newfiles = []
while True:
process(newfiles)
newfiles = check_for_new_files()
time.sleep(pollinterval)
或者只是将等待放在循环的中间(实际上是相同的效果):
while True:
newfiles = check_for_new_files()
time.sleep(pollinterval)
process(newfiles)