Python中的事件监听与处理
我先说一下,我之前只在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
提供了你所需要的功能。