Python中的事件监听与处理

2 投票
3 回答
2521 浏览
提问于 2025-04-18 00:10

我先说一下,我之前只在JavaScript中做过事件和触发器。

我有一个线程,它会运行并处理一个文件夹中的所有文件。我希望这个线程在每次有新文件写入这个文件夹时都能运行。我觉得用事件来实现这个功能,但我不知道在Python中该怎么做。

怎么让一个线程去触发一个事件呢?另一个线程又是怎么接收到这个事件的呢?

示例线程:

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

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

补充: 我对多线程还很陌生,也许我应该用这个方法呢?

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

感谢大家给出的精彩回答。

这是我最终使用的代码:

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()
1

首先,这并不是一个关于 python events 的问题,而是更关于 操作系统信号 的事情。你需要找到一种方法来监控目标文件夹的变化。因为你打算让你的代码可以在多个平台上运行,我建议你使用 Qt,特别是 QtCore.QFileSystemWatcher 这个工具。

这里有一个可以帮助你的答案:我该如何监控文件的变化?

1

通常,触发异步事件的办法是使用 signal 模块。文档中提到,信号 不能 用于线程之间的通信,所以在这种情况下使用线程是不合适的。当然,你也可以使用 threading.Condition 对象来使用线程。

不过,异步事件、线程和信号这些东西确实让人感到困惑,而且实现起来也不容易。你确定想要自己重新发明轮子吗?(你可能真的想这么做;我只是想确认一下。)如果不想的话,watchdog 提供了你所需要的功能。

撰写回答