2017-06-26 80 views
4

我正在尝试编写一个侦听事件(剪贴板内容的更改)并将剪贴板内容写入文件(on-change)的小剪贴板记录器(用于Linux)。使用while循环来监听事件?

我已经想出一个简单的while循环与剪贴板模块pyperclip:

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") 

所以我的第一个问题是,我可以实际运行一段时间真正的循环来“听”还是将消耗内存太多或通常效率低下或不好的做法?

第二个问题是,我如何在后台运行这个像shell作业控制(&符)?

我是否应该像建议here或某种事件循环或线程魔法一样使用守护进程?

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

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

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

+0

线程将被浪费在此代码上,因为此代码执行此操作并且仅此操作。但是,如果您的程序想要执行其他操作,而此代码正在运行,那么您只需要使用线程。另一个例外是,如果你有一个图形用户界面(会在程序中做一些其他的事情) – 3rdaccountQQ

回答

0

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

希望这回答了你的问题。

2

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

如果这是您的程序将要执行的操作,则不需要线程。

1

所以我的第一个问题是,我可以实际运行一段时间真正的循环来 “听”还是将占用过多的内存或者是一般 低效或不好的做法?

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

time.sleep(0.1) 

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

而第二个问题是,我怎么能像 一个shell作业控制(号)后台运行吗?

请参阅here

+0

谢谢你的回答! – upgrd

1

首先,你需要修复您的缩进如下所示:

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 
+0

非常感谢您的帮助,我已经改变了缩进! – upgrd