Найти - Пользователи
Полная версия: Выполнение скрипта при наличии файла в директории
Начало » Python для новичков » Выполнение скрипта при наличии файла в директории
1 2 3
Senhion
Доброго времени суток.
Подскажите пожалуйста, как правильно реализовать выполнение скрипта если в директории появился определенный файл ?

т.е.
0. ждем когда файл появится.
1. появился файл 1.txt
2. выполнился скрипт который за собой этот файл удалил.
3. ждем когда файл появится снова.
fata1ex
А в чем проблема-то? В цикле проверяете наличие файла, при появлении выполняете скрипт и удаляете файл. Алгоритм у вас уже написан.

http://stackoverflow.com/questions/82831/how-do-i-check-if-a-file-exists-using-python
http://docs.python.org/library/time.html#time.sleep
http://docs.python.org/library/os.html#os.remove
Senhion
fata1ex
А в чем проблема-то? В цикле проверяете наличие файла, при появлении выполняете скрипт и удаляете файл. Алгоритм у вас уже написан.

Спасибо за подсказки.

Проблема в том как правильно организовать этот цикл, а также выход из него, т.е. чтобы при определенном условии этот цикл закрывался по завершении обработки файла.

например обработка файла длится около 20 мин. за это время я принимаю решение, что больше мне отслеживать наличие файла не надо - и возникает вопрос как указать циклу что данный проход последний, дождаться его завершения и закрыть скрипт.
odnochlen
Senhion
как указать циклу что данный проход последний
Флаг поставить. Или в яве интересная вещь есть interrupt(), будит из sleep(), может и на питон перенесли.

Senhion
закрыть скрипт.
А почему бы не взять и закрыть?
Senhion
Флаг поставить
А как это сделать правильно?
sanodin
Поиск файла и запуск
import os
for d, dirs, files in os.walk("D:/"):
    for f in files:
        
        if f == "mail.py":
            print f,"Найдено в", d
            os.chdir(d)#указание директории
            os.startfile(f)#запуск файла

следит за файлами в папке temp
# -*- coding: cp1251 -*-
import os, win32file, win32con  
def _print(argStr):
    print unicode(argStr, 'cp1251')
ACTIONS = {
    1 : unicode("Создан", 'cp1251'),
    2 : unicode("Удалён", 'cp1251'),
    3 : unicode("Изменён", 'cp1251'),
    4 : unicode("Переименован во что-то", 'cp1251'),
    5 : unicode("Переименован из чего-то", 'cp1251')
}
FILE_LIST_DIRECTORY = 0x0001
path_to_watch = "C:\Documents and Settings\san\Local Settings\Temp\\"
hDir = win32file.CreateFile( # открываем каталог
    path_to_watch,
    FILE_LIST_DIRECTORY, # тип доступа
    win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE,
    None,
    win32con.OPEN_EXISTING,
    win32con.FILE_FLAG_BACKUP_SEMANTICS,
    None
)
while 1:
    results = win32file.ReadDirectoryChangesW ( # считываем изменения
        hDir,
        1024, # размер буфера для возврата результата
        True, # рекурсивно с подкаталогами
        win32con.FILE_NOTIFY_CHANGE_FILE_NAME | 
            win32con.FILE_NOTIFY_CHANGE_DIR_NAME |
            win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES |
            win32con.FILE_NOTIFY_CHANGE_SIZE |
            win32con.FILE_NOTIFY_CHANGE_LAST_WRITE |
            win32con.FILE_NOTIFY_CHANGE_SECURITY,
        None,
        None
    )
    for action, file in results:
        full_filename = os.path.join (path_to_watch, file)
        print full_filename, ACTIONS.get (action, "Unknown")

Удалить

	
os.remove("C:\\Temp\\test.txt")

проверить существование
файла
	
os.path.exists(filename)

А флаг,если файл обработан с нужным тебе условием -вернуть True, если вернули True - файл удалили
odnochlen
sanodin
“C:\\Temp\\test.txt”
Сырые строки же.
Senhion
А флаг,если файл обработан с нужным тебе условием -вернуть True, если вернули True - файл удалили

Так вопрос - как поставить флаг в момент выполнения цикла?…
sanodin
Все зависит от того как будет работать программа,если программа будет ждать появления файла,проводить его обработку и при наличии выполненного условия (файл обработан и удовлетворил ваши требования , продолжения сканирования данной директории на наличие такого файла не требуется),программа завершается.Ну а если Вы сами решаете нужно ли дальнейшее сканирование,то программа ждет Вашего вмешательства(ввода)
Senhion
0. запускается скрипт
1. пока нет условия для выхода
1.1 Если файл есть
1.1.1 выполняем над файлом непотребства
1.1.2 выводим результат
1.1.3 удаляем файл
1.2 ждем 10 секунд

Пока у меня в голове вот такая схема и я плохо представляю как реализовать условия для выхода:
ну кроме например как проверять наличие файла stop.script в директории, но каждый раз создавать такой файл в ручную мне кажется не есть хороший стиль - возможно есть более правильный путь?

Да - условие завершения скрипта определяется оператором, и скрипт не может быть завершен с момента начала обработки файла и до удаления обрабатываемого файла.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB