Seite 1 von 2
Timer für readline
Verfasst: Dienstag 28. Juli 2009, 16:38
von Maks81
hallo!
gibt es eine einfache möglichkeit um zu der readline funktion einen timer hinzuzufügen? mein ziel ist es das skript weiterlaufen zu lassen wenn nach einer gewissen zeit keine eingabe erfolgt, so dass nicht für ewig auf eine eingabe gewartet wird.
Verfasst: Dienstag 28. Juli 2009, 16:56
von EyDu
Hallo!
Meinst du mit der "readline-Funktion" "raw_input"(/"input")?
Und: warum soll es immer eine einfach Möglichkeit sein? ^^
Verfasst: Dienstag 28. Juli 2009, 17:46
von snafu
Vielleicht empfängt er auch irgendwelche Daten über's Netzwerk, die in regelmäßigen Abständen gelesen werden. Ich bin heute wieder in Hellseher-Laune.

Verfasst: Mittwoch 29. Juli 2009, 07:49
von Maks81
es werden ein paar kommandos an ein gerät gesendet. danach um der nutzer zu gefragt ob visuel das erwartete ergebnis eintritt oder nicht. Um die eingabe zu erfassen wird folgende funktion benutzt
interaction = sys.stdin.readline()
...
es soll also nur ja oder nein eingegeben werden. soweit läuft auch alles, nur sollte das skript eben nach einiger zeit - mit einer fehlerausgabe - weiterlaufen auch wenn keine eingabe erfolgt und das nächste script starten.
Verfasst: Mittwoch 29. Juli 2009, 09:26
von ms4py
Statt dieser Funktion solltest du immer raw_input() bzw. input() bei Python 3 verwenden.
Für dein Problem kannst du z.B. das Modul ``signal`` nutzen.
(Funktioniert aber nur unter Linux)
Alternativ kannst du mit Threads arbeiten, da kann man Timeouts verwenden.
Verfasst: Mittwoch 29. Juli 2009, 09:40
von snafu
ice2k3 hat geschrieben:Statt dieser Funktion solltest du immer raw_input() bzw. input() bei Python 3 verwenden.
Soll man das eigentlich machen, weil man es so macht (ist ja auch kürzer) oder hat es noch andere Vorteile gegenüber `sys.stdin.readline()`?
Verfasst: Mittwoch 29. Juli 2009, 10:05
von Maks81
raw_inout wollte ich als erstes verwenden, das wurde aber von dem verwendeten tool nicht akzeptiert (exception or syntax/intention error!?).
leider benutze ich kein linux sondern windows2000. gibt es da auch eine möglichkeit?
Verfasst: Mittwoch 29. Juli 2009, 10:22
von glaslos
Pseudo:
Code: Alles auswählen
starttime
while True:
read
if timenow - starttime > timeout
break
quick and dirty

Verfasst: Mittwoch 29. Juli 2009, 10:23
von lunar
@Maks81: Jedes normale Python 2.x unterstützt "raw_input()" unabhängig vom verwendeten Betriebsystem. Wenn also "raw_input()" nicht funktioniert, war das mit Sicherheit dein Fehler.
@snafu:
"raw_input()" wirft "EOFError", wenn der Nutzer ein EOF-Signal auslöst (in der Regel über Strg+D), "sys.stdin.readline()" gibt in diesem Fall dagegen eine leere Zeichenkette zurück. Außerdem benutzt es unter Unix-Systemen automatisch "readline", wenn dieses Modul vor dem Aufruf der Funktion importiert wurde.
Verfasst: Mittwoch 29. Juli 2009, 10:24
von mkesper
Maks81 hat geschrieben:raw_inout wollte ich als erstes verwenden, das wurde aber von dem verwendeten tool nicht akzeptiert (exception or syntax/intention error!?).
Es heiß auch raw_in
put bzw. ab Python 3.0 input.
Verfasst: Mittwoch 29. Juli 2009, 10:26
von cofi
glaslos hat geschrieben:quick and dirty

Sehr dirty. IMHO loest es auch gar nicht das Problem, da trotzdem auf die Eingabe gewartet wird.
Verfasst: Mittwoch 29. Juli 2009, 10:27
von Rebecca
lunar hat geschrieben:Außerdem benutzt es unter Unix-Systemen automatisch "readline", wenn dieses Modul vor dem Aufruf der Funktion importiert wurde.
Mmh, das macht raw_input doch auch?
Verfasst: Mittwoch 29. Juli 2009, 10:28
von snafu
Rebecca hat geschrieben:lunar hat geschrieben:Außerdem benutzt es unter Unix-Systemen automatisch "readline", wenn dieses Modul vor dem Aufruf der Funktion importiert wurde.
Mmh, das macht raw_input doch auch?
Er redet doch von raw_input.
Verfasst: Mittwoch 29. Juli 2009, 10:36
von lunar
Eigentlich nicht

Streng grammatikalisch gesehen ist "es" ein relativer Satzanschluss und bezieht sich damit auf das Subjekt des vorherigen Satzes. Eine schöne grammatikalische Konstruktion, die es erlaubt, Sätze zu schreiben, bei denen jeder rauslesen kann, was ihm gerade passt
Im Ernst, der Satz sollte sich wirklich auf raw_input() beziehen, der vorherige Satz über "sys.stdin.readline()" eigentlich ans Ende des Postings kommen ... ich habe wohl schneller geschrieben als gedacht
Zur Klarstellung: "sys.stdin.readline()" verwendet "readline"
nicht, das tut nur "raw_input()". Entschuldigung für die Verwirrung.
Verfasst: Mittwoch 29. Juli 2009, 10:51
von glaslos
cofi hat geschrieben:glaslos hat geschrieben:quick and dirty

Sehr dirty. IMHO loest es auch gar nicht das Problem, da trotzdem auf die Eingabe gewartet wird.
Er möchte doch die Eingabe, jedoch mit Timeout. Sprich: Nach z.B. 2 Minuten soll das Programm mit der Nachricht: "Keine Eingabe" weiterlaufen.
Verfasst: Mittwoch 29. Juli 2009, 10:56
von lunar
glaslos hat geschrieben:cofi hat geschrieben:glaslos hat geschrieben:quick and dirty

Sehr dirty. IMHO loest es auch gar nicht das Problem, da trotzdem auf die Eingabe gewartet wird.
Er möchte doch die Eingabe, jedoch mit Timeout. Sprich: Nach z.B. 2 Minuten soll das Programm mit der Nachricht: "Keine Eingabe" weiterlaufen.
Das tut dein Programm aber nicht, da "read()" blockierend ist.
Verfasst: Mittwoch 29. Juli 2009, 11:22
von ms4py
Verfasst: Mittwoch 29. Juli 2009, 11:29
von lunar
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.
Verfasst: Mittwoch 29. Juli 2009, 12:35
von Maks81
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
Verfasst: Mittwoch 29. Juli 2009, 13:09
von ms4py
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.