Seite 1 von 1
Input Buffer
Verfasst: Freitag 26. September 2014, 14:10
von doggy
Guten Tag liebes Forum,
Folgendes Thema habe ich auch bereits im Raspberry Pi Forum angesprochen. Dort konnte aber keine Lösung entwickelt werden.
Ich erkläre einmal mein Problem anhand eines Beispielprogramms. Bitte einfach nur dieses Problem beachten.
Code: Alles auswählen
from time import sleep
while True:
sleep(3)
a = raw_input("NUMMER")
print(a)
Gebe ich nun in der sleep Zeit etwas in der Console ein. Entstehen folgende ungewollte Ausgaben:
Code: Alles auswählen
11
NUMMER11
NUMMER1
1
1
1
1
1
NUMMER1
NUMMER1
NUMMER1
NUMMER1
NUMMERHi
Hi
mhhNUMMERKomisch
mhhKomisch
mhh
NUMMERmhh
NUMMER
Wie kann ich verhindern, dass davor die Eingabe die ungewollte betätigt wurde nun einfach als Input verwendet wird? Eigentlich möchte ich, ja keinen input während einer sleepzeit oder z.b. einer Dauerschleife haben.
Mit freundliche Grüßen,
doggy
Re: Input Buffer
Verfasst: Freitag 26. September 2014, 14:29
von BlackJack
@doggy: Dafür gibt es keine portable Lösung, aber da Raspi das Ziel ist, würde ich `termios.tcflush()` als IMHO einfachste Lösung vorschlagen.
Re: Input Buffer
Verfasst: Freitag 26. September 2014, 14:29
von lackschuh
Gibt es ''raw_input'' in Python 3 überhaupt noch?
Edit:
Bei mir tritt dies nicht auf (Python 2.7)
Code: Alles auswählen
NUMMER:
NUMMER: 123
123
NUMMER: 321
321
NUMMER: asdf
asdf
NUMMER:
NUMMER:
Re: Input Buffer
Verfasst: Freitag 26. September 2014, 14:33
von doggy
Einfach vor den input schreiben diese Funktion?
Ich verwende Python 2
lackschuh hat geschrieben:Gibt es ''raw_input'' in Python 3 überhaupt noch?
Edit:
Bei mir tritt dies nicht auf (Python 2.7)
Code: Alles auswählen
NUMMER:
NUMMER: 123
123
NUMMER: 321
321
NUMMER: asdf
asdf
NUMMER:
NUMMER:
Du gibts in deiner Ausgabe, auch nicht die Zahl während der Wartezeit ein, sondern beim Input. Dann gehts ja auch
Re: Input Buffer
Verfasst: Freitag 26. September 2014, 14:43
von lackschuh
@doggy
Es ändert sich nichts, zumindest unter Windows. Auch wenn ich wie wild in die Tasten haue und nicht warte, bis die raw_input() abermals aufgerufen wird. Das Ergebnis ist das selbe wie oben. Ich versteh's nicht und muss weg :K
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf-8
from __future__ import print_function
from time import sleep
while True:
sleep(1)
a = raw_input("NUMMER: ")
print(a)
Code: Alles auswählen
sadfNUMMER:
sadf
NUMMER: asdf
asdf
33NUMMER:
33
NUMMER: 4
4
NUMMER: 2
2
22NUMMER:
22
NUMMER: 22
22
NUMMER:
Re: Input Buffer
Verfasst: Freitag 26. September 2014, 14:48
von doggy
Ahh, da liegt das Problem

Unter Windows. Ich arbeite aber mit Raspbian, also einem Linux System.
Habe auch einfach mal zum testen, genau dein Programm kopiert. Wie erwartet. Mein Problem verändert sich nicht im geringsten.
Code: Alles auswählen
a
NUMMER: a
aNUMMER:
a
NUMMER: a
a
NUMMER: a
a
a
b
c
dNUMMER: a
NUMMER: b
NUMMER: c
NUMMER: d
NUMMER:
Re: Input Buffer
Verfasst: Freitag 26. September 2014, 15:21
von BlackJack
@lackschuh: Du hast doch unter Windows genau das gleiche Problem. Beim ersten Beispiel hast Du bevor 'NUMMER' ausgegeben wurde etwas eingegeben was dann Teil der Eingabe wurde. Genau das soll *nicht* passieren. Egal was Du vor der Ausgabe von 'NUMMER' eingibst, soll ignoriert werden und nur das was nach 'NUMMER' eingegeben wird, soll berücksichtigt werden.
Re: Input Buffer
Verfasst: Freitag 26. September 2014, 15:22
von doggy
Intressanterweise, habe ich das Problem gelöst.
Hier mein neuer Code, der das Problem löst (Keine Ahnung was die Funktion macht)
Code: Alles auswählen
from time import sleep
import sys
import os, select
while True:
print("..while..")
sleep(5)
sys.stdout.flush()
while len(select.select([sys.stdin.fileno()], [], [], 0.0)[0])>0:
os.read(sys.stdin.fileno(), 4096)
a = raw_input("Nummer ")
print(a
Re: Input Buffer
Verfasst: Freitag 26. September 2014, 15:32
von lackschuh
Code: Alles auswählen
asdf
asdf <--- Eingabe vor Abfrage
NUMMER: asdf <--- Eingabe vor Abfrage ergibt das hier
NUMMER: asdf <--- normale Eingabe
asdf <--- Ausgabe
asdf <--- Eingabe
asdf <--- Eingabe
NUMMER: asdf <--- Resultat von Eingabe asdf
NUMMER: asdf <--- Resultat von Eingabe asdf
NUMMER: 1234 <--- normale Eingabe
1234 <--- Ausgabe
NUMMER:[Code=python file=Untitled.py]
[/code]
Ok, jetzt verstehe ich was gemeint ist, aber letztendlich wird doch nur die korrekte Eingabe von raw_input() in ''a'' gespeichert?
Re: Input Buffer
Verfasst: Freitag 26. September 2014, 15:41
von doggy
Leider passiert das in meinem richtigen Programm nicht. Dort habe ich Probleme damit, da irgendwie der input einfach übersprungen wird und die zuvor eingegebene Variable verwendet wird.
Jedenfalls, ist die PIN-Eingabe nun funktionierend mit diesem Befehl.
Re: Input Buffer
Verfasst: Freitag 26. September 2014, 15:44
von BlackJack
@lackschuh: Was meinst Du mit der korrekten Eingabe? Da wird unter umständen mehr drin gespeichert als gewollt war, eben das was *vor* dem Prompt eingegeben wurde.
Re: Input Buffer
Verfasst: Samstag 27. September 2014, 09:36
von lackschuh
@BlackJack
Hast recht, es werden in der Tat alle Eingaben gespeichert, also auch vor 'NUMMER: '
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf-8
from __future__ import print_function
from time import sleep
while True:
sleep(2)
a = raw_input("NUMMER: ")
with open('test.txt', 'a') as f:
f.write(a + '\n')
print(a)
Re: Input Buffer
Verfasst: Montag 29. September 2014, 06:57
von doggy
Habe die Lösung im Internet gefunden. Für alle, die das Problem selbst haben

Dieser Code hilft!
Code: Alles auswählen
from time import sleep
import sys
import os, select
while True:
print("..while..")
sleep(5)
sys.stdout.flush()
while len(select.select([sys.stdin.fileno()], [], [], 0.0)[0])>0:
os.read(sys.stdin.fileno(), 4096)
a = raw_input("Nummer ")
print(a)
Re: Input Buffer
Verfasst: Montag 29. September 2014, 07:26
von jens