【问题标题】:Use while loop to listen for an event?使用while循环来监听事件?
【发布时间】:2017-06-26 17:47:20
【问题描述】:

我正在尝试编写一个小型剪贴板记录器(适用于 linux),它侦听事件(剪贴板内容的更改)并将剪贴板内容写入文件(更改时)。

我想出的是一个带有剪贴板模块 pyperclip 的简单 while 循环:

import pyperclip

recent_value = ""
while True:
    tmp_value = pyperclip.paste()
    if tmp_value != recent_value:
        recent_value = tmp_value
        with open(".clipboard_history.txt", "a") as f:
            f.write(recent_value + "\n")

所以我的第一个问题是,我真的可以运行一个 while True 循环来“收听”吗?或者这会消耗太多内存还是通常效率低下或不好的做法?

第二个问题是,我怎样才能像 shell 作业控制(和号)一样在后台运行它?

我应该选择像建议的here 这样的守护进程还是某种事件循环或线程魔法?

我基本上想要一些位于后台并监听事件(剪贴板内容更改),对其做出反应(写入文件)并再次等待的东西。

=============================

编辑:感谢您的输入! + 新问题:如果我使用线程,我还需要 sleep 方法吗?

【问题讨论】:

  • 线程会浪费在这段代码上,因为这段代码只做了这个。但是,如果您的程序想做其他事情,而这段代码正在运行,那么只有在那时您才会想要使用线程。另一个例外是如果你有一个 GUI(会在程序下做其他事情)

标签: python loops events while-loop daemon


【解决方案1】:

运行当前循环会消耗 CPU,从 time 导入,并使用 time.sleep(1) 或其他会使程序休眠一段时间(理想情况下为 0.1-2~ 秒,如果您认为它们会是)快速交换复制/粘贴)

如果这就是你的程序要做的全部,你不需要线程。

【讨论】:

    【解决方案2】:

    首先,您需要按以下方式修复缩进:

    while True:
        tmp_value = pyperclip.paste()
        if tmp_value != recent_value:
            recent_value = tmp_value
            with open(".clipboard_history.txt", "a") as f:
                f.write(recent_value + "\n")
    

    现在,如果您的脚本有更多代码,并且您希望 loop 继续在后台运行,您可以使用 threading 并为循环定义一个函数:

    from threading import Thread
    t = Thread(target=your-func, args=[])
    t.start()
    
    def your-func(self):
        # your loop goes here
    

    【讨论】:

    • 非常感谢您的帮助,我已经更改了缩进!
    【解决方案3】:

    所以我的第一个问题是,我真的可以运行一个 while True 循环来 '听' 或者这会消耗太多内存还是一般 低效或糟糕的做法?

    效率低下。您可能想在循环结束时添加

    time.sleep(0.1)
    

    更好的做法是在每次写入剪贴板时运行您的脚本。这个讨论也和你有关:Trigger an event when clipboard content changes

    第二个问题是,我怎样才能在后台运行它 一个 shell 作业控制(和号)?

    请参阅here

    【讨论】:

      【解决方案4】:

      要在没有控制台的情况下运行 python 文件,扩展名应为 .pyw,例如,在运行 logger.pyw 时,它将在不打开 python shell 的情况下运行。

      希望这回答了你的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-05
        相关资源
        最近更新 更多