Python中的事件侦听和处理

时间:2014-03-27 14:54:04

标签: python multithreading events listener

我首先要说的是,除了javascript之外,我从未做过任何事情和触发事件。

我有一个运行并处理文件夹中所有文件的线程。我希望每次新文件写入该文件夹时都运行此线程。我认为事件会是这样做的,但我不知道如何在python中做到这一点。

如何告诉线程抛出或触发事件?另一个线程如何选择它?

示例主题:

def list_files_thread(dir):
    for filename in os.listdir(dir):
        print filename

thread.start_new_thread(list_files_thread, ('output',))

编辑: 我是mutlithreading的新手,所以也许我应该使用它呢?

class list_files_thread(threading.Thread):
    def __init__(self, directory):
        self.directory = directory
    def run(self):
        list_files(self.directory)

def list_files(directory_path):
    for filename in os.listdir(directory_path):
        print filename

3 个答案:

答案 0 :(得分:1)

首先,这不是python events的问题,而是关于操作系统信号的问题。您需要某种方法来监视目标文件夹中的更改。由于您计划将代码设置为多平台,我建议您专门使用Qt QtCore.QFileSystemWatcher

以下是一款可以帮助您的aswer:How do I watch a file for changes?

答案 1 :(得分:1)

嗯,触发异步事件的典型方法是使用signal模块。如文档所述,信号不能用于线程间通信,因此在这种情况下线程不合适。当然,您也可以使用threading.Condition个对象来使用线程。

话虽这么说,异步事件,线程和信号令人困惑,难以正确实现。你确定要重新发明轮子吗? (你可能很好;我只想检查。)如果没有,watchdog提供你需要的确切功能。

答案 2 :(得分:0)

感谢您的回答。

这是我最终使用的代码:

def list_files(directory_path):
    print directory_path
    parent_dir = os.path.abspath(os.path.join(directory_path, os.pardir))
    print parent_dir
    for filename in os.listdir(parent_dir):
         print filename

class trigger_event_handler(FileSystemEventHandler):
    def on_created(self, event):
        super(trigger_event_handler, self).on_created(event)
        list_files(event.src_path)


new_event_handler = trigger_event_handler()
observer = Observer()
observer.schedule(new_event_handler, output_dir, recursive=False)
observer.start()
try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()
observer.join()