print() hängt bei Verwendung von _thread

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
netter_louis
User
Beiträge: 1
Registriert: Mittwoch 24. Februar 2021, 10:31

Hallo zusammen,

ich versuche gerade, einen Logger für Bluetooth-Ereignisse zu schreiben. Das klappt gut, ich gebe die Ereignisse per print() auf der Konsole aus. Jetzt möchte ich den Logger per Tastendruck beenden. Das funktioniert auch, wenn ich mit keyboard.is_pressed() nach den Tastaturereignissen frage.
Jetzt läuft der Logger aber auf einem Raspi, auf dem ich per ssh eingeloggt bin. Da gibt es keine Tastaturereignisse, daher möchte ich von stdin lesen. Das mache ich mit getch.getch(). Da das aber blockierend ist, und damit kein Bluetooth-Loggen funktioniert, habe ich das getch.getch() in eine Funktion ausgelagert, die per _thread.start_new_thread() gestartet wird und parallel zum Loggen läuft.
Da ergibt sich das Problem, dass print() nur kurz etwas auf der Konsole ausgibt und dann nichts mehr dort ankommt. Leite ich die Ausgaben des Skriptes dagegen in Datei um, kommt in dieser Datei alles an.
Abbrechen per Tastendruck funktioniert damit.
Das hat aber nichts mit Bluetooth zu tun, ich kann das auch ohne Bluetooth nachstellen, mit einer einfachen Hauptschleife. Der entsprechende Code dazu sieht so aus:

Code: Alles auswählen

#!/usr/bin/python3
import getch
import _thread

run_keyboard_test = True

def keywatcher(threadname,second_arg):
  char=getch.getch()
  print("Key pressed")
  global run_keyboard_test
  run_keyboard_test = False

#Start keyboard watcher

_thread.start_new_thread( keywatcher, ("Keywatcher",2) )

while run_keyboard_test == True:
  print("no key pressed")

Was kann ich tun, dass die Konsolenausgabe wieder vollständig ist?

Beste Grüße!
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Der _ bei _thread zeigt doch deutlich, dass man das nicht verwenden sollte. threading ist das Modul, das möglich wäre, aber das ist eh viel zu kompliziert.
Der übliche Weg, eine Endlos-Schleife abzubrechen ist Ctrl+C. Also nicht Anykey, aber wenigstens der Standard, der automatisch ohne zusätzlichen Code funktioniert.
Antworten