Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的事件侦听和处理_Python_Multithreading_Events_Listener - Fatal编程技术网

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

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

首先,这不是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中通常有一种首选方法)。我不确定您想要的最终目标,也不确定列表目录线程会做什么。你问的是具体的事件,所以除此之外,你真的应该发布一个单独的问题。我的回答是否实现了你所说的?好吧,最好的办法是找出答案,然后继续测试它!(然而,我也不会让你绞死——是的,它似乎完成了你最初从你提供的简短描述中开始的目标。)