Input Buffer

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
doggy
User
Beiträge: 22
Registriert: Freitag 19. September 2014, 10:32

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
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.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

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: 
doggy
User
Beiträge: 22
Registriert: Freitag 19. September 2014, 10:32

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
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

@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:
doggy
User
Beiträge: 22
Registriert: Freitag 19. September 2014, 10:32

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:
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.
doggy
User
Beiträge: 22
Registriert: Freitag 19. September 2014, 10:32

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
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

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?
doggy
User
Beiträge: 22
Registriert: Freitag 19. September 2014, 10:32

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.
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.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

@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)
doggy
User
Beiträge: 22
Registriert: Freitag 19. September 2014, 10:32

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)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten