Цикл while для отслеживания папки и запуска скрипта, если условие истинно - PullRequest
4 голосов
/ 04 декабря 2011

Я пытаюсь написать скрипт, который следит за папкой, и, если к папке добавлен файл, обработайте файл и переместите его в папку DONE.

Я думаю, что хочу использовать цикл while для этого ... Я буду отслеживать папку с чем-то вроде:

count = len(os.listdir('/home/lou/Documents/script/txts/'))
while (count = 1):
    print Waiting...

Я хочу, чтобы скрипт проверял len () каждые 30 секунд, и если он меняется с 1 на 2, запустите скрипт, в противном случае подождите еще 30 секунд и проверьте len (). Сценарий переместит новый файл в папку, и len () вернется к 1. Сценарий будет работать 24/7.

любая помощь очень ценится

спасибо

1012 * Lou *

Ответы [ 3 ]

6 голосов
/ 04 декабря 2011

В зависимости от размера каталога, может быть лучше проверить номер файла, только если mtime каталога изменилось.Если вы используете Linux, вас также может заинтересовать inotify.

import sys
import time
import os

watchdir = '/home/lou/Documents/script/txts/'
contents = os.listdir(watchdir)
count = len(watchdir)
dirmtime = os.stat(watchdir).st_mtime

while True:
    newmtime = os.stat(watchdir).st_mtime
    if newmtime != dirmtime:
        dirmtime = newmtime
        newcontents = os.listdir(watchdir)
        added = set(newcontents).difference(contents)
        if added:
            print "Files added: %s" %(" ".join(added))
        removed = set(contents).difference(newcontents)
        if removed:
            print "Files removed: %s" %(" ".join(removed))

        contents = newcontents
    time.sleep(30)
2 голосов
/ 04 декабря 2011

Для ожидания 30 секунд сделайте

import time # outside the loop

time.sleep(30)
0 голосов
/ 03 июня 2014

Вот общее решение, которое при вызове будет НАВСЕГДА ждать, пока пройденный каталог не будет изменен. Эта функция может быть вызвана перед любым кодом, который будет работать с каталогом, например, подсчитывать, сколько файлов и т. Д. Она может использоваться для блокировки выполнения до изменения dir:

def directory_modified(dir_path, poll_timeout=30):
    import os
    import time
    init_mtime = os.stat(dir_path).st_mtime
    while True:
        now_mtime = os.stat(dir_path).st_mtime
        if init_mtime != now_mtime:
            return True
        time.sleep(poll_timeout)

Обратите внимание, что вы можете перезаписать тайм-аут, по умолчанию 30 секунд. Вот используемая функция:

>>> att_dir = '/data/webalert/attachments'
>>> directory_modified(att_dir, 5)   # Some time goes by while I modify the dir manually
True

Функция возвращает истину максимум через 5 секунд выполнения в случае, если сон начался, как только я изменил каталог. Надеюсь, это поможет тем, кто нуждается в общем подходе.

...