Watchdog: Сторожевой пес с pygame

Созданный на 23 нояб. 2018  ·  5Комментарии  ·  Источник: gorakhargosh/watchdog

Я хотел бы использовать сторожевой таймер с pygame, возможно ли это? Цель моего сценария - когда что-то происходит в папке, будет отображаться видео. Проблема в том, что когда я запускаю скрипт, он не возвращает никаких ошибок.

Вот код, который я использую.

#!/usr/bin/python
import time
import os
import pygame
from moviepy.editor import *
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

link = 'abs\\'

def detectFile():    
    pygame.display.set_caption('Hello World!')
    clip = VideoFileClip('01.mp4')
    clip.preview(fps=30,fullscreen=True)
    pygame.quit()


class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print 'test'
        detectFile()        

if __name__ == "__main__":
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path=link, recursive=False)
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
not a bug

Самый полезный комментарий

@alciomarhollanda, это не проблема сторожевого пса. и вы можете закрыть эту проблему. Я проверил ваш код и убедился, что сторожевой таймер обнаруживает создание нового файла в каталоге abs \ и печатает test. Но проблема в том, где вы работаете с pygame. Вы создаете обработчик и передаете его экземпляру Observer. Фактически экземпляр Observer работает как отдельный поток. И насколько я знаю, pygame работает только в основном потоке. Поэтому, когда экземпляр Observer вызывает обработчик (и функцию detectFile), pygame не работает, потому что это делается не в основном потоке. Вот рабочий пример:

#!/usr/bin/python                                               
import time                                                     
import os                                                       
import pygame                                                   
from moviepy.editor import *                                    
from watchdog.observers import Observer                         
from watchdog.events import FileSystemEventHandler              
from threading import Event                                     

modified = Event()                                              
link = 'abs\\'                                                  


def detectFile():                                               
    while True:                                                 
       modified.wait()                                          
       pygame.display.set_caption('Hello World!')               
       clip = VideoFileClip('01.mp4')                           
       clip.preview(fps=30,fullscreen=True)                     
       pygame.quit()                                            
       break                                                    


class MyHandler(FileSystemEventHandler):                        
    def on_modified(self, event):                               
        print 'test'                                            

if __name__ == "__main__":                                      
    event_handler = MyHandler()                                 
    observer = Observer()                                       
    observer.schedule(event_handler, path=link, recursive=False)
    observer.start()                                            
    detectFile()                                                
    observer.stop()                                             
    observer.join()

Все 5 Комментарий

@alciomarhollanda, пожалуйста, укажите, какую ОС вы используете? Ваш скрипт и абс \ находятся в одном каталоге?

Здравствуйте @rrzaripov , я использую windows 10. Папка abs \ находится в том же каталоге.

Спасибо

@alciomarhollanda, это не проблема сторожевого пса. и вы можете закрыть эту проблему. Я проверил ваш код и убедился, что сторожевой таймер обнаруживает создание нового файла в каталоге abs \ и печатает test. Но проблема в том, где вы работаете с pygame. Вы создаете обработчик и передаете его экземпляру Observer. Фактически экземпляр Observer работает как отдельный поток. И насколько я знаю, pygame работает только в основном потоке. Поэтому, когда экземпляр Observer вызывает обработчик (и функцию detectFile), pygame не работает, потому что это делается не в основном потоке. Вот рабочий пример:

#!/usr/bin/python                                               
import time                                                     
import os                                                       
import pygame                                                   
from moviepy.editor import *                                    
from watchdog.observers import Observer                         
from watchdog.events import FileSystemEventHandler              
from threading import Event                                     

modified = Event()                                              
link = 'abs\\'                                                  


def detectFile():                                               
    while True:                                                 
       modified.wait()                                          
       pygame.display.set_caption('Hello World!')               
       clip = VideoFileClip('01.mp4')                           
       clip.preview(fps=30,fullscreen=True)                     
       pygame.quit()                                            
       break                                                    


class MyHandler(FileSystemEventHandler):                        
    def on_modified(self, event):                               
        print 'test'                                            

if __name__ == "__main__":                                      
    event_handler = MyHandler()                                 
    observer = Observer()                                       
    observer.schedule(event_handler, path=link, recursive=False)
    observer.start()                                            
    detectFile()                                                
    observer.stop()                                             
    observer.join()

@BoboTiG этот вопрос можно закрыть.

@BoboTiG этот вопрос можно закрыть.

спасибо @BoboTiG

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

fx86 picture fx86  ·  3Комментарии

AndreaCrotti picture AndreaCrotti  ·  3Комментарии

Nikolaissue picture Nikolaissue  ·  6Комментарии

xsank picture xsank  ·  5Комментарии

SamSchott picture SamSchott  ·  4Комментарии