我首先要说的是,除了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
答案 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()