2017-06-26 81 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