Das tut dein Programm aber nicht, da "read()" blockierend ist.glaslos hat geschrieben:Er möchte doch die Eingabe, jedoch mit Timeout. Sprich: Nach z.B. 2 Minuten soll das Programm mit der Nachricht: "Keine Eingabe" weiterlaufen.cofi hat geschrieben:Sehr dirty. IMHO loest es auch gar nicht das Problem, da trotzdem auf die Eingabe gewartet wird.glaslos hat geschrieben:quick and dirty
Timer für readline
Hier eine Thread-Variante:
http://code.activestate.com/recipes/473878/
Oder noch besser als Dekorator:
http://code.activestate.com/recipes/483752/
http://code.activestate.com/recipes/473878/
Oder noch besser als Dekorator:
http://code.activestate.com/recipes/483752/
Das kann imho nicht richtig funktionieren. Der Code bricht die Funktion ja nicht ab, sondern lässt sie im Hintergrund weiterlaufen. Daher kann man in einem Programm exakt ein einziges Mal auf diese Weise eine Eingabe abfragen. Springt dann der Timeout an, bleibt die Standardeingabe durch den Thread blockiert. Jede weitere Eingabe geht also erstmal an die Funktion im Thread, und verschwindet damit faktisch im Nirvana.
glaube ich habe ein lösung gefunden:
import sys
import threading
interaction=""
def input():
global interaction
interaction = sys.stdin.readline()
...
T = threading.Thread(target=input)
T.start()
T.join(120)
if interaction:
...
scheint zu funktionieren.
habe hier auch raw_input() nochmal ausprobiert, hat auch funktioniert
import sys
import threading
interaction=""
def input():
global interaction
interaction = sys.stdin.readline()
...
T = threading.Thread(target=input)
T.start()
T.join(120)
if interaction:
...
scheint zu funktionieren.
habe hier auch raw_input() nochmal ausprobiert, hat auch funktioniert
Nein das funktioniert nicht, weil der Thread immer noch blockiert und somit den nächsten Input einfach dem Mainthread "klaut" (wie lunar schon beschrieben).
Versuch das mal mit subprocess zu implementieren, damit müsste es gehen.
Versuch das mal mit subprocess zu implementieren, damit müsste es gehen.
Hallo, ich habe das mit dem thread mal etwas anders programmiert. Auf Windows XP mit Python 2.6 funktioniert das.
Code: Alles auswählen
import threading
import time
Eingabe = None
class ReadText(threading.Thread):
def run(self):
global Eingabe
while True:
Eingabe = raw_input()
def warten(Wartezeit):
global Eingabe
Eingabe = None
Startzeit = time.time()
while Eingabe == None and (time.time() - Startzeit) < Wartezeit:
time.sleep(.1)
if Eingabe is not None:
print "Eingegeben wurde:", Eingabe
else:
print "Keine Eingabe erfolgt"
return Eingabe
w = ReadText()
w.daemon = True
w.start()
print "Warte 1"
e = warten(5)
print "Warte 2"
e = warten(10)
print "Ende"
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Den hätt ich auch mal gern gehabt, der würde viele Bugs einsparen.Maks81 hat geschrieben:intention error!?