2017-06-26 3 views
4

Ich versuche, eine kleine Zwischenablage Logger (für Linux), die auf ein Ereignis (die Änderung der Zwischenablage Inhalt) hört und schreibt den Inhalt der Zwischenablage in eine Datei (On-Change).Verwenden Sie die while-Schleife, um auf ein Ereignis zu hören?

Was ich mit kommen haben, ist eine einfache while-Schleife mit der Zwischenablage Modul 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") 

Also meine erste Frage ist, kann ich eigentlich eine while True Schleife zu ‚hören‘ laufen oder wird diese verbrauchen zu viel Speicher oder in der Regel ineffizient oder schlechte Praxis?

Und die zweite Frage ist, wie kann ich das im Hintergrund wie eine Shell-Job-Kontrolle (Et-Zeichen) ausführen?

Sollte ich für einen Daemon wie vorgeschlagen here oder eine Art Event-Schleife oder Threading-Magie gehen?

Ich möchte im Grunde etwas, das im Hintergrund sitzt und auf ein Ereignis hört (Inhalt der Zwischenablage ändert), reagiert darauf (schreibt in eine Datei) und wartet erneut.

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

edit: Danke für den Input! + neue Frage: Benötige ich noch die Schlafmethode, wenn ich Threading verwende?

+0

Threading wäre für diesen Code verschwendet, weil dieser Code dies und nur dies tut. Wenn Ihr Programm jedoch etwas anderes machen möchte, während dieser Code läuft, dann und nur dann würden Sie Threading verwenden wollen. Eine weitere Ausnahme wäre, wenn Sie eine GUI (würde gehen unter Programm tun etwas anderes tho) – 3rdaccountQQ

Antwort

0

Um eine Python-Datei ohne Konsole auszuführen, sollte die Erweiterung .pyw sein, zum Beispiel wenn logger.pyw ausgeführt wird, wird es ausgeführt, ohne eine Python-Shell zu öffnen.

Hoffe das beantwortet Ihre Frage.

2

Wenn Sie Ihre aktuelle Schleife laufen lassen, wird die CPU entladen, von Zeit importiert und time.sleep (1) oder etwas anderes verwendet, das das Programm für eine kurze Zeit in den Schlaf versetzt (idealerweise 0,1-2 Sekunden, wenn Sie denken (Kopieren schnell kopieren)

Sie müssen nicht thread, wenn dies alles ist, was Ihr Programm tun wird.

1

Also meine erste Frage ist, kann ich eigentlich eine while True Schleife laufen ‚hören‘ oder wird dies zu viel Speicher verbrauchen oder allgemein ineffizient oder schlechte Praxis sein?

Es ist ineffizient. Sie wollen wahrscheinlich am Ende der Schleife

time.sleep(0.1) 

Bessere Praxis Ihr Skript jedes Mal Zwischenablage geschrieben wird ausgeführt wäre hinzuzufügen. Diese Diskussion ist auch für Sie relevant: Trigger an event when clipboard content changes

Und die zweite Frage ist, wie kann ich diese laufen im Hintergrund wie ein Shell-Auftragssteuerung (Ampersand)?

Siehe here.

+0

Vielen Dank für Ihre Antwort! – upgrd

1

Zunächst einmal müssen Sie die Vertiefung als die folgende beheben:

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

Nun, wenn Ihr Skript mehr Code hat, und Sie wollen, dass diese loop im Hintergrund laufen zu halten, Sie threading verwenden können und Definieren Sie eine Funktion für die Schleife:

+0

Vielen Dank für Ihre Hilfe, ich habe den Einzug bereits geändert! – upgrd

Verwandte Themen