6

我想找出一种方法来提醒 python 脚本文件已完成复制。这是场景:

  1. to_print脚本通过不断轮询来监视文件夹os.listdir()

  2. 每次os.listdir()返回一个文件列表,其中存在一个以前没有见过的文件,脚本对该文件执行一些操作,包括打开它和操作它的内容。

当文件很小时这很好,并且将文件从其原始源复制到正在监视的目录所花费的时间少于直到下一次轮询之前的剩余时间os.listdir()。但是,如果轮询并找到文件,但它仍在复制过程中,则当脚本尝试对其执行操作时,文件内容已损坏。

相反,我希望能够(使用os.stat或以其他方式)知道当前正在复制文件,并等待它完成,直到我采取行动为止。

我目前的想法是os.stat()每次找到新文件时使用,然后等到下一次轮询并比较自上次轮询以来修改/创建的日期,如果它们保持不变,则该文件是“稳定的”,否则继续轮询,直到轮询为止。我不确定这是否可行,因为我不太熟悉 Linux/Unix 如何更新这些值。

4

2 回答 2

3

尝试inotify

这是用于查看文件的 Linux 标准。对于您的用例,该事件IN_CLOSE_WRITE似乎很有希望。有一个用于 inotify 的 Python 库。一个非常简单的例子(取自那里)。您需要对其进行修改以仅捕获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/

于 2012-10-10T16:44:40.137 回答
2

由于可以在轮询间隔内复制文件,因此只需在检查新文件之前处理上次轮询找到的新文件。换句话说,而不是这样:

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)
于 2012-10-10T16:38:07.770 回答