Python中的事件侦听和处理
首先,我要说的是,除了javascript之外,我从来没有使用过其他任何东西来完成事件和触发器 我有一个线程可以运行和处理文件夹中的所有文件。我希望每当有新文件写入该文件夹时,该线程都能运行。我认为事件是实现这一点的方法,但我不知道如何在python中实现这一点 如何让线程抛出或触发事件?另一个线程是如何拾取这个的 示例线程:Python中的事件侦听和处理,python,multithreading,events,listener,Python,Multithreading,Events,Listener,首先,我要说的是,除了javascript之外,我从来没有使用过其他任何东西来完成事件和触发器 我有一个线程可以运行和处理文件夹中的所有文件。我希望每当有新文件写入该文件夹时,该线程都能运行。我认为事件是实现这一点的方法,但我不知道如何在python中实现这一点 如何让线程抛出或触发事件?另一个线程是如何拾取这个的 示例线程: def list_files_thread(dir): for filename in os.listdir(dir): print filena
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
首先,这不是python事件的问题,更多的是操作系统信号的问题。您需要某种方法来监视目标文件夹中的更改。由于您计划将代码设计成多平台,我建议您特别使用Qt
QtCore.QFileSystemWatcher
这里有一个aswer可以帮助您:触发异步事件的典型方法是使用模块。正如文档所指出的,信号不能用于线程间通信,因此在这种情况下线程是不合适的。当然,也可以使用对象来使用线程
也就是说,异步事件、线程和信号令人困惑,难以正确实现。你确定要重新发明轮子吗?(您很可能是;我只是想检查一下。)如果不是,则提供您所需的确切功能。谢谢您的精彩解答 这是我最后使用的代码:
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()
这不是你问题的答案,但你应该真正使用
线程
,而不是线程
。前者是高级API,后者是相当低级的。我对多线程也不熟悉……我认为您可能比线程更适合多处理。请看multiprocessing.queue,您想要的是,您的代码能够在该文件夹中创建新文件时进行检测。是吗?@RaydelMiranda我正在尝试制作一个独立于平台的程序,但我目前使用的是Windows。是的,这个想法是,这个线程将列出目录中的文件(或任何操作),可能会将它们移动到“已处理”文件夹,并且每当写入新文件时,它都会重新运行线程。谢谢!如果我有权访问将文件写入该文件夹的脚本,这会是另一种情况吗?当然可以。然后您只需要实现和obserber模式
,并将其与提供者-消费者模式相结合
,我将更新答案以显示我的意思。我不能创建一个监视程序线程吗。在该线程中,如果它检测到一个更改,它会生成一个“list_dir”线程?当然-有很多很多方法可以完成相同的事情(尽管在python中通常有一种首选方法)。我不确定您想要的最终目标,也不确定列表目录线程会做什么。你问的是具体的事件,所以除此之外,你真的应该发布一个单独的问题。我的回答是否实现了你所说的?好吧,最好的办法是找出答案,然后继续测试它!(然而,我也不会让你绞死——是的,它似乎完成了你最初从你提供的简短描述中开始的目标。)